習題 國王(狀壓DP)

2021-09-25 16:36:20 字數 1023 閱讀 2859

題目:

記憶體限制:64 mib時間限制:500 ms標準輸入輸出

題目型別:傳統評測方式:文字比較

提交提交記錄

返回比賽

題目描述

原題來自:sgu 223

在 n*n的棋盤上放k  個國王,國王可攻擊相鄰的 8個格仔,求使它們無法互相攻擊的方案總數。

輸入格式

只有一行,包含兩個整數 n 和k 。

輸出格式

每組資料一行為方案總數,若不能夠放置則輸出 0。

樣例樣例輸入 1

3 2
樣例輸出 1

16
樣例輸入 2

4 4
樣例輸出 2

思路:因為n小,所以第一選擇就是搜尋或者狀壓dp,因為每乙個各自的狀態為放或者不放,總的時間複雜度為o(2^n^2)

之後考慮狀壓dp ,設dp[i][j][k],為第i行狀態為j一共有k個國王,j狀態指將j轉化成二進位制,每一位上的數是1就代表放,

反之則代表不放,

考慮衝突問題

就是上一行的狀態右移或者左移再並,

最後統計一下最後一行的答案即可

還有一些小優化,因為每一行的狀態的總數是一定的,列舉每乙個狀態,也就是1~2^n時,

有些狀態是不行的,

此時我們將這些可行的狀態記錄下來

**

#includeusing namespace std;

int n,num_king;

long long dp[15][1050][105];

int a[1050];

int num[1050];

int tot;

long long ans;

int main()}}

}} }

for(int i=1;i<=tot;i++)

cout

}

狀壓dp基礎習題

題解非常基礎的一道狀壓dp 我們用二進位制來表示每一行取數情況,1 11表示取,0 00表示不取 很容易得到狀態轉移方程 f i j max f i j f i 1 k a ns i j f i j max f i j f i 1 k ans i j f i j ma x f i j f i 1 k...

SGU 223 國王 狀壓DP

在 n n n n 的棋盤上放 k k k 個國王,國王可攻擊相鄰的 8 8 8 個格仔,求使它們無法互相攻擊的方案總數。n n 狀壓dp是一種比較暴力的dp。n n 首先dp i j k 表示前i行放置k個國王,且當前行狀態是j的方案數。n n 轉移方程 dp i j k dp i 1 m k s...

狀壓dp 玉公尺田 狀壓dp

相關 強相關 327.玉公尺田 狀壓dp 小國王 狀壓dp 是井字形,本題是十字形。思路 狀態計算 時間複雜度 n 2 n 2n o n 22n 12 2 24n 2 n 2 n o n2 12 2 n 2n 2 n o n22n 12 224 看著妥妥超時,但是裡面合法狀態很少 依舊可以過 在此,...