AHOI中国象棋(dp)

大力dp题。

每行每列最多放两个,考虑用行作为dp阶段。

dp[i][j][k]表示i行,有一个的有j列,有两个的有k列。

然后就是分类讨论。

一个都不放,放一个在0出,放一个在1出,放两个在0,放两个在1,放两个在01,大力转移。

Code

#include<iostream>
using namespace std;
long long n,m,dp[][][],ans,mod;
inline int c(int n){return (n*(n-))>>;}
int main()
{
cin>>n>>m;
mod=;
dp[][][]=;
for(int i=;i<=n;++i)
for(int j=;j<=m;++j)
for(int k=;k+j<=m;++k)
{
dp[i][j][k]+=dp[i-][j][k];
dp[i][j][k]%=mod;
if(m-k-j+>&&j->=)dp[i][j][k]+=dp[i-][j-][k]*(m-k-j+);
dp[i][j][k]%=mod;
if(j+<=m&&k->=)dp[i][j][k]+=dp[i-][j+][k-]*(j+);
dp[i][j][k]%=mod;
if(j->=&&m-k-j+>)dp[i][j][k]+=dp[i-][j-][k]*c(m-k-j+);
dp[i][j][k]%=mod;
if(j+<=m&&k->=)dp[i][j][k]+=dp[i-][j+][k-]*c(j+);
dp[i][j][k]%=mod;
if(k->=&&j>)dp[i][j][k]+=dp[i-][j][k-]*(m-j-k+)*j;
dp[i][j][k]%=mod;
}
for(int i=;i<=m;++i)
for(int j=;j+i<=m;++j)
ans+=dp[n][i][j],ans%=mod;
cout<<ans;
return ;
}
上一篇:【智能算法】粒子群算法(Particle Swarm Optimization)超详细解析+入门代码实例讲解


下一篇:(原)kenel开机logo的制作