[ZJOI2006]超级麻将

可以转成动态规划问题,f[i][j][k][0/1]表示选完了前i种牌,第i-1种选了j个,第i种选了k个,选/不选一对的。

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int T;bool f[105][105][105][2];int a[105];
int main() {
  scanf("%d",&T);
  while(T--) {
    memset(f,0,sizeof f);
    f[0][0][0][0]=1;
    for(int i=1;i<=100;i++) scanf("%d",&a[i]);
    for(int i=1;i<=100;i++) {
      for(int j=0;j<=a[i-1];j++) {
        for(int k=0;k<=a[i];k++) {
          if(k>1)f[i][j][k][1]|=f[i][j][k-2][0];
          if(k>2)f[i][j][k][1]|=f[i][j][k-3][1],f[i][j][k][0]|=f[i][j][k-3][0];
          if(k>3)f[i][j][k][1]|=f[i][j][k-4][1],f[i][j][k][0]|=f[i][j][k-4][0];
          if(j>=k&&a[i-2]>=k) f[i][j][k][0]|=f[i-1][a[i-2]-k][j-k][0],f[i][j][k][1]|=f[i-1][a[i-2]-k][j-k][1];
        }
      }
    }
    puts(f[100][a[99]][a[100]][1]?"Yes":"No");
  }
}
我是咸鱼。转载博客请征得博主同意Orz
原文地址:https://www.cnblogs.com/sdfzhsz/p/9362918.html