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;
}
/*
*/
有没有巨佬可以帮忙康一下谢谢啦!