題目鏈結
在\(n\times n\) 的棋盤裡面放 \(k\)個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共\(8\) 個格仔。
\(1\le n\le 9,0\le k\le n*n\)
\(f(i,j,l)\)來表示前 \(i\) 行,當前狀態為\(j\) ,且已經放置 \(l\)個國王時的方案。
\(j\) 這一維用二進位制來表示
先預處理在一行上的所有合法狀態(即排除同一行上兩個相鄰的情況),然後直接列舉這些來匹配上一行的狀態即可。
\(f(i,j,l) = \sum f(i-1,x,l-num(x))\)
\(num(x)\) 為x在二進位制下有多少個1
轉移時要排除兩行間國王互相攻擊不合法的情況。
#include using namespace std;
typedef long long ll;
vectorsta,stan;
ll d[10][(1<<10)][100];
int n,k;
bool ok(int i,int j)
int main()}}
if(!flag)continue;
sta.push_back(i);
stan.push_back(num + (i >> (n-1) & 1));
}for(int i=0;ifor(int i=2;i<=n;i++)}}
}}
ll res = 0;
for(int i=0;ires += d[n][i][k];
cout
}
SCOI2005 互不侵犯(狀壓DP)
題意 給定乙個n n的棋盤,放置k個國王,使他們互相攻擊不到對方,共有多少種方案。國王可以攻擊上下左右,左上左下,右上右下附近的一格,共8格。資料範圍 1 n 9,0 k n n.因為n的範圍很小,而且每一行對應的乙個方案可以用乙個二進位制數表示,所以容易想到用狀壓dp。又因題目有限制要用多少個國王...
SCOI2005 互不侵犯(狀壓DP)
在 n n 的棋盤裡面放 k 個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。一行 n,k 方案數狀態壓縮dp基礎 狀壓和二進位制有著不可割捨的聯絡 一幫情況下,我 習慣把狀態抽象成一維 並且用二進位制表示,然後再去想怎...
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...