| 比赛 | 
    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;
}