比赛 2025.5.5 评测结果 WWWWWWWTTT
题目名称 cake 最终得分 0
用户昵称 flyfree 运行时间 6.822 s
代码语言 C++ 内存使用 8.53 MiB
提交时间 2025-05-05 10:53:42
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define MAXN 2010
#define mod  998244353
inline ll read(){
    ll f = 1, num = 0;
    char c = getchar();
    while(c < '0' || c > '9'){
        if(c=='-') f = -1;c = getchar();
     }
    while(c>='0'&&c<='9') num = num * 10 + c - '0', c = getchar();
    return num * f;
}

char c[MAXN][MAXN],pre[MAXN][MAXN];
ll dp[MAXN],lst[MAXN];
ll n,m;

ll solve(ll l, ll r){
    memset(lst, 0, sizeof(lst));
    ll nxt = 0,res = 0;
    for(int i = 1;i <= m; ++i){
        ll cnt = pre[r][i] - pre[l - 1][i];
        if(cnt >= 3)return 0;
        if(!cnt)continue;
        lst[i] = nxt;
        nxt = i;
    }
    ll idx = 0;
    for(int i = 1;i <= m; ++ i){
        ll cnt = pre[r][i] - pre[l - 1][i];
        if(cnt + idx > 2)return 0;
        if(idx == 0){
            idx += cnt;
            res = res * (i - lst[i]) % mod;
        }
        idx = (idx + cnt) % 2;
    }
    if(idx)return  0;
    else return res;
}

int main(){
    freopen("cake.in", "r", stdin);
    freopen("cake.out", "w", stdout);
    n = read(),m = read();
    for(int i = 1;i <= n; ++i){
        for(int j = 1;j <= m; ++j){
            cin >> c[i][j];
            pre[i][j] = pre[i - 1][j];
            if(c[i][j] == 'Y'){
                pre[i][j] ++ ;
            }
        }
    }
    dp[0] = 1;
    for(int i = 1;i <= n; ++i){
        for(int l = 0;l < i; ++l){
            // cout << "solve : " << l + 1 << " " << i << " " << solve(l + 1, i) << endl;
            dp[i] = (dp[i] + 1ll * dp[l] * solve(l + 1, i) % mod) % mod;
        }
        // cout << dp[i] << endl;
    }
    cout << dp[n] << endl;
    return 0;
}