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