玄学dp
我们不难发现,一个位置的影响只有他前面一位和他后面以为,然后我们就可以枚举一下第i位,i-1位,i-2位分别打出了多少牌,然后,之前的牌里有没有打出过(对),然后暴力转移就行了,因为我们只关心状态是否可以达到,所以用bool数组,|=就好了,不然会TLE
代码
//By AcerMo
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int M=150;
int n,pa[M];
bool f[M][M][M][2];
signed main()
{
scanf("%d",&n);
while (n--)
{
for (int i=1;i<=100;i++) scanf("%d",&pa[i]);
memset(f,0,sizeof(f));f[0][0][0][0]=1;
for (int i=1;i<=100;i++)
for (int k=0;k<=pa[i-1];k++)
for (int j=0;j<=pa[i];j++)
{
if (j>1) f[i][k][j][1]|=f[i][k][j-2][0];
if (j>2) f[i][k][j][1]|=f[i][k][j-3][1],f[i][k][j][0]|=f[i][k][j-3][0];
if (j>3) f[i][k][j][1]|=f[i][k][j-4][1],f[i][k][j][0]|=f[i][k][j-4][0];
if (k>=j&&pa[i-2]>=j) f[i][k][j][0]|=f[i-1][pa[i-2]-j][k-j][0],f[i][k][j][1]|=f[i-1][pa[i-2]-j][k-j][1];
}
f[100][pa[99]][pa[100]][1]?puts("Yes"):puts("No");
}
return 0;
}