为何样例输出5
查看原帖
为何样例输出5
416242
New_hope楼主2023/8/12 16:48
#include<bits/stdc++.h>
#define int long long
using namespace std;

int dp[10][1 << 9][100]; // 第i行,状态j,一共放k个棋子
bool yep[1 << 9];

signed main() {

   int n,k;
   cin >> n >> k;

   int Size = 1 << n;
   for(int i = 0; i < Size; i ++) {
      int a = (i << 1) & i, b = (i >> 1) & i;
      if (!a && !b) yep[i] = 1;
   }
   dp[0][0][0] = 1;
   for(int i = 1; i <= n; i ++) { // 枚举行
      for(int j = 0; j < Size; j ++) { // 枚举当前行状态
         if(!yep[j]) continue;

         int t = j, cntj = 0; 
         while(t) {
            cntj += t & 1; 
            t = t >> 1;
         } 
         for(int p = 0; p < Size; p ++) { // 枚举上一行状态
            int a = p & j, b = p & (j >> 1), c = p & (j << 1);
            if(!a && !b && !c) {
               for(int q = cntj; q <= k; q ++) dp[i][j][cntj] += dp[i-1][p][q - cntj];
            }
         }
      }
   }

   int ans = 0;
   for(int i = 0; i < Size; i ++) {
      ans += dp[n][i][k];
   }
   cout << ans;
   return 0;
}
2023/8/12 16:48
加载中...