本文共 1091 字,大约阅读时间需要 3 分钟。
dp[i][j][K] 表示第i行第j个状态放了K个国王,有多少种方法
#include#include #include #include using namespace std;typedef long long LL;int n,K,cnt;int s[150];int p[150];LL dp[11][150][101];bool ok(int x){ if(x&(x<<1)) return false; return true;}void init(){ cnt = 0; for(int i = 0;i < (1< > n >> K){ init(); memset(dp,0,sizeof(dp)); for(int i = 0;i < cnt;i++){ p[i] = cal(s[i]); if(p[i] <= K) dp[0][i][p[i]] = 1; } for(int i = 1;i < n;i++){ for(int j = 0;j < cnt;j++){ if(p[j] > K) continue; for(int k = 0;k < cnt;k++){ if(s[j]&s[k]) continue; if((s[j]&(s[k]<<1))||(s[j]&(s[k]>>1))) continue; for(int r = 0;r <= K;r++) if(r + p[j] <= K ) dp[i][j][r+p[j]] += dp[i-1][k][r]; } } } LL ans = 0; for(int i = 0;i < cnt;i++){ ans += dp[n-1][i][K]; } cout << ans << endl; }}
转载地址:http://odsgi.baihongyu.com/