luogu P2051 [AHOI2009]中国象棋

统计方案,果断 dp

注意到合法方案即为每一行,每一列的棋子数不超过2

\(f_{i,j,k}\)表示放到第\(i\)行,有\(j\)列可以放2个,有\(k\)列可以放1个的方案

然后就随便讨论一下

详见代码

// luogu-judger-enable-o2
#include<bits/stdc++.h>
#define LL long long
#define il inline
#define re register
#define db double
//#define max(a,b) ((a)>(b)?(a):(b))

using namespace std;
const int N=100+10,mod=9999973;
il LL rd()
{
    re LL x=0,w=1;re char ch=0;
    while(ch<'0'||ch>'9') {if(ch=='-') w=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
    return x*w;
}
LL f[2][N][N],ans;
int n,m;

int main()
{
  n=rd(),m=rd();
  int la=0,now=1;f[0][m][0]=1;
  for(int i=0;i<n;i++)
    {
      for(int j=0;j<=m;j++)
        for(int k=0;k<=m;k++)
          {
            if(!f[la][j][k]) continue;
            f[now][j][k]=(f[now][j][k]+f[la][j][k])%mod;
            if(j-1>=0&&k+1<=m) f[now][j-1][k+1]=(f[now][j-1][k+1]+f[la][j][k]*j)%mod;
            if(k-1>=0) f[now][j][k-1]=(f[now][j][k-1]+f[la][j][k]*k)%mod;
            if(j-2>=0&&k+2<=m) f[now][j-2][k+2]=(f[now][j-2][k+2]+f[la][j][k]*j*(j-1)/2)%mod;
            if(j-1>=0) f[now][j-1][k]=(f[now][j-1][k]+f[la][j][k]*j*k)%mod;
            if(k-2>=0) f[now][j][k-2]=(f[now][j][k-2]+f[la][j][k]*k*(k-1)/2)%mod;
            f[la][j][k]=0;
          }
      now^=1,la^=1;
    }
  for(int j=0;j<=m;j++)
    for(int k=0;k<=m;k++)
      ans=(ans+f[la][j][k])%mod;
  printf("%lld\n",ans);
  return 0;
}

转载于:https://www.cnblogs.com/smyjr/p/9563126.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值