在\(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...