为什么只有溢出的时候才能对
查看原帖
为什么只有溢出的时候才能对
689146
mushezi楼主2024/7/30 21:26

代码如下, 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;
}

2024/7/30 21:26
加载中...