SCOI2005 互不侵犯 狀態壓縮入門題)

2022-01-10 05:33:14 字數 1115 閱讀 1605

使用狀態壓縮,最好了解 位運算使用

scoi2005 互不侵犯

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

我們用 \(f(i,j,l)\) 表示前 \(i\) 行,當前狀態為 \(j\) ,且已經放置 \(l\) 個國王時的方案數。

其中 \(j\) 這一維狀態我們用乙個二進位制整數表示( \(j\) 的某個二進位制位為 0 代表對應的列不放國王,否則代表對應的列放國王)。

我們需要在剛開始的時候預處理出一行的所有合法狀態 \(sta(x)\) (排除同一行內兩個國王相鄰的不合法情況),在轉移的時候列舉這些可能狀態進行轉移。

設當前行的狀態為 \(j\) ,上一行的狀態為 \(x\) ,可以得到下面的轉移方程: \(f(i,j,l) = \sum f(i-1,x,l-sta(x))\) 。

需要注意在轉移時排除相鄰兩行國王互相攻擊的不合法情況。

#include #include using namespace std;

long long sta[2005], sit[2005], f[15][2005][105];

int n, k, cnt;

void dfs(int x, int num, int cur)

dfs(x, num, cur + 1); // cur位置不放國王

dfs(x + (1 << cur), num + 1,

cur + 2); // cur位置放國王,與它相鄰的位置不能再放國王

}int main()

long long ans = 0;

for (int i = 1; i <= cnt; i++) ans += f[n][i][k]; // 累加答案

cout << ans << endl;

return 0;

}

幾道練習題

noi2001 炮兵陣地

「usaco06nov」玉公尺田 corn fields

ahoi2009 中國象棋

九省聯考 2018 一雙木棋

SCOI2005 互不侵犯

在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。只有一行,包含兩個數n,k 1 n 9,0 k n n 方案數3 2 同sgu223 include include include include ...

SCOI2005 互不侵犯

題目描述 在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。輸入格式 只有一行,包含兩個數n,k 1 n 9,0 k n n 輸出格式 所得的方案數 ly最可愛啦 這題。想了5分鐘,寫了10分鐘,調了...

SCOI2005 互不侵犯

在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。兩個數n,k 1 n 9,0 k n n 方案數。3 2果然啊 狀壓題都是乙個套路 和前面那個noi的題是乙個套路 具體實現也基本一樣 就是記錄的狀態...