代码如下, cnt[i - 2] 当 i 是 1 的时候不会变成 -1 吗 但是加一个特判就过不了了, 求助啊
#include <bits/stdc++.h>
using namespace std;
const int N = 102;
const int M = 100;
bool f[N][N][N][2];
int n, cnt[N];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
while(n--){
memset(f, 0, sizeof(f));
f[0][0][0][0] = 1;
for(int i = 1; i <= M; i++){
cin >> cnt[i];
for(int j = 0; j <= cnt[i - 1]; j++){
for(int k = 0; k <= cnt[i]; k++){
// 阶段: 前 i 个已经拿完了, 现在考虑 i
// 对于现有的状态我们可以选择不同拿法
// 出对子
if(k > 1){
f[i][j][k][1] |= f[i][j][k - 2][0];
}
// 出刻子
if(k > 2){
f[i][j][k][0] |= f[i][j][k - 3][0];
f[i][j][k][1] |= f[i][j][k - 3][1];
}
if(k > 3){
f[i][j][k][0] |= f[i][j][k - 4][0];
f[i][j][k][1] |= f[i][j][k - 4][1];
}
// 出 k 个顺子
if(k <= j && k <= cnt[i - 2]){
f[i][j][k][0] |= f[i - 1][cnt[i - 2] - k][j - k][0];
f[i][j][k][1] |= f[i - 1][cnt[i - 2] - k][j - k][1];
}
}
}
}
if(f[M][cnt[M - 1]][cnt[M]][1]) cout << "Yes\n";
else cout << "No\n";
}
return 0;
}