互不侵犯 狀壓

2022-03-20 01:29:36 字數 782 閱讀 3690

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

(1 <= n <= 9, 0 <= k <= n x n)

只有一行,包含兩個數 n, k。

所得的方案數。

3 2
16
大家都做過玉公尺地吧,這其實和那道題很像,只是玉公尺地是上下左右衝突,這個多了個角上也衝突,那就再加兩個if判斷角上衝突的情況

具體流程詳見注釋

#include#include#include#define int long long

using namespace std;

int dp[10][1<<10][100];//dp[i][j][k]表示第i行擺放的國王狀態為j,總共擺放k個國王的方案數

int state[1<<10], num[1<<10];//預處理每行所有合法的狀態和他們包含1的個數

int n, cnt, tot, ans;//tot為每行合法狀態總數

int lowbit(int x)

int getnum(int x)

signed main()}}

}for(int i=1; i<=tot; i++) ans += dp[n][i][cnt]; //列舉最後一行的方案,求和方案數

printf("%lld\n", ans);

return 0;

}

互不侵犯king 狀壓dp

在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8個格仔。1 le n le 9,0 le k le n n 這道題如果普通dfs肯定會超時。為什麼呢?我們發現一行中的狀態是固定的,同時行與行之間的衝突情況也...

狀壓dp SCOI 2005 互不侵犯

題意 在n n n nn n的棋盤裡面放k kk個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上左下右上右下八個方向上附近的各乙個格仔,共8 88個格仔。考慮如何狀壓,對於每一行,我們用乙個長度為n nn的二進位制串表示每一行的狀態,比如1010 1010 1010 表示...

M 互不侵犯King(壓狀dp)

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