题目地址 :https://www.luogu.org/problemnew/show/P2593。
无脑DP(虽说是抄的额)
#include <iostream> #include <cstdio> #include <cstring> using namespace std; inline int read() { int res=0;char ch=getchar(); while(!isdigit(ch))ch=getchar(); while(isdigit(ch)) res=(res<<3)+(res<<1)+(ch^48), ch=getchar(); return res; } #define reg register int T; int a[105]; int f[105][105][105][2]; int main() { T = read(); while(T--) { for (reg int i = 1 ; i <= 100 ; i ++) a[i] = read(); memset(f, 0, sizeof f); f[0][0][0][0] = 1; for (reg int i = 1 ; i <= 100 ; i ++) { for (reg int j = 0 ; j <= a[i-1] ; j ++) { for (reg int k = 0 ; k <= a[i] ; k ++) { if (k >= 2) f[i][j][k][1] |= f[i][j][k-2][0]; if (k >= 3) f[i][j][k][1] |= f[i][j][k-3][1], f[i][j][k][0] |= f[i][j][k-3][0]; if (k >= 4) 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 and 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]; } } } printf(f[100][a[99]][a[100]][1] ? "Yes\n" : "No\n"); } return 0; }