SCOI2005 互不侵犯 (狀壓DP)

2022-05-11 05:09:38 字數 856 閱讀 6275

題目鏈結

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