SCOI2005 互不侵犯(狀壓DP)

2022-01-12 08:21:02 字數 970 閱讀 7125

在\(n×n\)的棋盤裡面放\(k\)個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。

一行\(n,k\)

方案數狀態壓縮dp基礎

狀壓和二進位制有著不可割捨的聯絡

一幫情況下,(我)習慣把狀態抽象成一維

並且用二進位制表示,然後再去想怎麼壓縮狀態

比如互不侵犯這個題

根據題目中給出的變數

直接定義dp[i][j][k]表示

第i行在狀態為j時,共用了k個國王的方案數

那麼如何判斷上下左右有沒有重複呢

這就用到二進位制的運算&

然後預處理所有不必轉移的狀態和所有的狀態

所有狀態是指n位數的所有狀態

例如n=3

所有狀態就是

000,001,010,011,100,101,110,111

num陣列記錄當前狀態的國王數量

第一能夠減小常數

第二作為狀態轉移的初始狀態

#include #include #include #include #define int long long

using namespace std;

inline int read()

const int maxn = 520;

int dp[20][maxn][maxn];

int s[maxn], num[maxn];

int cnt, n, k;

inline void pre()

}signed main()

}int ans = 0;

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

ans += dp[n][i][k];

cout << ans << '\n';

return 0;

}

SCOI2005 互不侵犯(狀壓DP)

題意 給定乙個n n的棋盤,放置k個國王,使他們互相攻擊不到對方,共有多少種方案。國王可以攻擊上下左右,左上左下,右上右下附近的一格,共8格。資料範圍 1 n 9,0 k n n.因為n的範圍很小,而且每一行對應的乙個方案可以用乙個二進位制數表示,所以容易想到用狀壓dp。又因題目有限制要用多少個國王...

SCOI2005 互不侵犯 (狀壓DP)

題目鏈結 在 n times n 的棋盤裡面放 k 個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共 8 個格仔。1 le n le 9,0 le k le n n f i,j,l 來表示前 i 行,當前狀態為 j 且已經放置 l...

SCOI2005 互不侵犯King (狀壓DP)

給乙個n n n 9 的棋盤,問放k k n n 個國王滿足不衝突的方案數,國王的攻擊範圍是周圍的八個位置。非常經典的狀壓dp,dp i j s 代表第i行,已經存了j個棋子,這一行的國王存放狀態為s的方案數,空間複雜度n k 2 n 大概1e6,時間複雜度n k 2 2n 大概2e8,最後在dar...