15分求调,悬赏一个关注
查看原帖
15分求调,悬赏一个关注
744789
Big_Bishop楼主2023/10/15 12:18

rt,dp调不出来,f[i][j][k]f[i][j][k] 表示考虑到第 ii 行第 jj 列手上剩 kk 元的方案数

代码

#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

*/
2023/10/15 12:18
加载中...