蒟蒻40分求助
查看原帖
蒟蒻40分求助
271577
入门题杀手楼主2020/10/30 07:54

RT 头铁写了记忆化搜索 然后只有50分:

#include<bits/stdc++.h>
using namespace std;
const int p=9999973;
long long dp[110][110][110],n,m; //dp[i][j][k]前i行有j列放了1个棋子 k列放了2个棋子的方案数
bool vis[110][110][110];
int find(int i,int j,int k) {
	if(i==0&&j==0&&k==0) return 1;
	if(j<0||k<0||i<0) return 0;
	if(vis[i][j][k]) return dp[i][j][k];
	dp[i][j][k]=find(i-1,j,k);
	//第i行只放了1个棋子
	dp[i][j][k]=(dp[i][j][k]+find(i-1,j+1,k-1)*(j+1))%p;//放在1个棋子列
	dp[i][j][k]=(dp[i][j][k]+find(i-1,j-1,k)*(m-j+1-k))%p;//放在0个棋子列
	//第i行放了2个棋子
	dp[i][j][k]=(dp[i][j][k]+find(i-1,j+2,k-2)*(j+2)*(j+1)/2)%p;//都放在1个棋子列
	dp[i][j][k]=(dp[i][j][k]+find(i-1,j-2,k)*(m-j-k+2)*(m-j-k+1)/2)%p;//都放在0个棋子列
	dp[i][j][k]=(dp[i][j][k]+find(i-1,j,k-1)*j*(m-j-k+1))%p;//放在0个棋子列和1个棋子列
	vis[i][j][k]=1;
	return dp[i][j][k];
}
int main() {
	int ans=0;
	scanf("%lld%lld",&n,&m);
	for(int i=0; i<=m; i++)
		for(int j=0; j<=m; j++)
			ans=(ans+find(n,i,j))%p;
	printf("%lld",(ans+p)%p);
	return 0;
}
/*

*/

有没有巨佬可以帮忙康一下谢谢啦!

2020/10/30 07:54
加载中...