[Luogu2593] [ZJOI2006]超级麻将

题目地址 :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
" : "No
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/BriMon/p/9550513.html