在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上
左下右上右下八个方向上附近的各一个格子,共8个格子。
在N×N的棋盘里面放K个国王,使他们互不攻击,共有多少种摆放方案。国王能攻击到它上下左右,以及左上
左下右上右下八个方向上附近的各一个格子,共8个格子。
只有一行,包含两个数N,K ( 1 <=N <=9, 0 <= K <= N * N)
方案数。
1 #include<bits/stdc++.h> 2 using namespace std; 3 int n,k,num[1005]; 4 long long dp[10][1005][1005]; 5 bool flag[1005]; 6 long long ans; 7 int main() 8 { 9 scanf("%d%d",&n,&k); 10 for (int i=0; i<(1<<n); i++) 11 if (!(i&(i<<1))) 12 { 13 flag[i]=true; 14 int t=i; 15 while (t) 16 { 17 num[i]+=(t&1); 18 t>>=1; 19 } 20 dp[1][num[i]][i]=1; 21 } 22 for (int i=2; i<=n; i++) 23 for (int j=0; j<=k; j++) 24 for (int now=0; now<(1<<n); now++) 25 { 26 if (!flag[now]) continue; 27 if (num[now]>j) continue; 28 for (int last=0; last<(1<<n); last++) 29 { 30 if (!flag[last]) continue; 31 if ((last & now) || ((now<<1)&last) || ((now>>1)&last)) continue; 32 dp[i][j][now]+=dp[i-1][j-num[now]][last]; 33 } 34 } 35 for (int i=0; i<(1<<n); i++) 36 ans+=dp[n][k][i]; 37 cout<<ans<<endl; 38 return 0; 39 }
dp还是欠缺啊!!!要多练啊!!!dp很重要!!!
加油加油加油!!!fighting fighting fighting!!!
BZOJ 1087 [SCOI2005]互不侵犯King 【状压dp】
原文:https://www.cnblogs.com/Frank-King/p/9334786.html