互不侵犯king 狀壓dp

2022-05-06 16:30:11 字數 922 閱讀 5399

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

這道題如果普通dfs肯定會超時。為什麼呢?我們發現一行中的狀態是固定的,同時行與行之間的衝突情況也是固定的。而dfs重複列舉了每一行的狀態,重複判斷了這一行的狀態是否與前一行相衝突。於是我們預處理出一行中的狀態,同時預處理出兩行狀態的衝突情況,然後dp就行了。\(f[i][j][k]\)表示列舉到第i行,有j個國王,當前行狀態的編號為k。它只能通過不與k衝突的上一行轉移而來。於是就過了。

#include using namespace std;

long long st[100];

int cnt[100], now[10], map[100][100];

int n, k, cntst;

long long f[10][100][100];

void dfs(int pos)

st[cntst]=tmp;

for (int i=pos+2; i<=n; ++i) dfs(i);

now[pos]=0;

}int main()

f[0][0][0]=1;

for (int i=1; i<=n; ++i)

for (int j=0; j<=k; ++j)

for (int st=0; st<=cntst; ++st)

}long long ans=0;

for (int i=0; i<=cntst; ++i)

ans+=f[n][k][i];

printf("%lld", ans);

return 0;

}

M 互不侵犯King(壓狀dp)

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

BZOJ 1087 互不侵犯King(狀壓DP)

time limit 10 sec memory limit 162 mb submit 3984 solved 2323 submit status discuss 在n n的棋盤裡面放k個國王,使他們互不攻擊,共有多少種擺放方案。國王能攻擊到它上下左右,以及左上 左下右上右下八個方向上附近的各乙...

BZOJ 1087 互不侵犯King (狀壓dp)

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