rt,dp调不出来,f[i][j][k] 表示考虑到第 i 行第 j 列手上剩 k 元的方案数
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
void read(int &p){
char ch=getchar();
while(ch<'0'||ch>'9') ch=getchar();
while(ch<='9'&&ch>='0') p=(p<<1)+(p<<3)+ch-'0',ch=getchar();
}
const ll mod=998244353;
const int N=50;
int n,m,k;
int a[N][N],b[N][N];
ll f[N][N][505],cnt[N][N][N][N];
int main(){
//freopen("travel2.in","r",stdin);
read(n);read(m);read(k);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
read(a[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
read(b[i][j]);
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cnt[i][j][i][j]=1;
for(int l=i;l<=n;l++){
for(int r=j;r<=m;r++){
if(l==i&&r==j) continue;
cnt[i][j][l][r]=(cnt[i][j][l-1][r]+cnt[i][j][l][r-1])%mod;
}
}
}
}
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// printf("%d ",cnt[i][j][n][m]);
// }
// puts("");
// }
//printf("\n");
f[1][1][k]=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(i==1&&j==1) continue;
for(int l=0;l<=k;l++){
for(int o=1;o<=i;o++){
for(int p=1;p<=j;p++){
if(o==i&&p==j) continue;
int sum=(i-o)*a[o][p]+(j-p)*b[o][p];
f[i][j][l]=(f[i][j][l]+((f[o][p][l+sum]*cnt[o][p][i][j])%mod))%mod;
//printf("%lld\n",cnt[o][p][i][j]);
}
}
}
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
printf("%lld ",f[i][j][0]);
}
printf("\n");
}
return 0;
}
/*
3 3 5
3 2 1
2 1 3
1 3 2
1 2 3
2 3 1
3 1 2
*/