比赛 2025.5.5 评测结果 ATTTTTTTTT
题目名称 cake 最终得分 10
用户昵称 徐诗畅 运行时间 17.991 s
代码语言 C++ 内存使用 18.06 MiB
提交时间 2025-05-05 09:12:23
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int mod=998244353,N=2005;
int n,m,pre[N][N];
long long dp[N],dp2[N];
string cake[N];
int main(){
	freopen("cake.in","r",stdin);
	freopen("cake.out","w",stdout);
    scanf("%d%d",&n,&m);
    for(int i = 0;i<n;i++) cin>>cake[i];
    for (int i = 1;i<=n;i++){
        for (int j = 1;j<=m;j++){
            pre[i][j]=pre[i-1][j]+pre[i][j-1]-pre[i-1][j-1];
            if(cake[i-1][j-1]=='Y'){
                pre[i][j]++;
            }
        }
    }
    dp[0]=1;
    for(int i = 1;i<=n;i++){
        for(int j=0;j<i;j++){
            memset(dp2,0,sizeof(dp2)); dp2[0]=1;
            map<int,long long> mp; mp[0]=1;
            int sum=0;
            for(int k=1;k<=m;k++){
                sum+=pre[i][k]-pre[j][k]-pre[i][k-1]+pre[j][k-1];
                if(mp.find(sum-2)!=mp.end())
                dp2[k]=mp[sum-2];
                mp[sum]=(mp[sum]+dp2[k])%mod;
            }
            dp[i] =(dp[i]+dp[j]*dp2[m]%mod)%mod;
        }
    }
    printf("%lld",dp[n]);
    return 0;
}