博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
洛谷 2051 [AHOI2009] 中国象棋
阅读量:6335 次
发布时间:2019-06-22

本文共 2125 字,大约阅读时间需要 7 分钟。

这也是一道dp方程很难想出来的dp

要是想通了方程,后续的推导也需要花费一定的时间,所以是一道好题

我直接讲dp方程吧

因为我也没有想出来dp方程,是某个同学告诉我的

dp[i][j][k]表示到了第i行,这一行之前有j列放了1个棋子,有k列放了2个棋子

这个方程确实不好想

转移有一点多

总共有6个转移方程

其实是压了一维,这一维是放了0个棋子的列数

因为这一维可以由其他两维推出他就=m-j-k;

dp[i][j][k]=(dp[i][j][k]+dp[i-1][j][k])%mod;

表示这一行什么棋子也不取

 

dp[i][j][k]=(dp[i][j][k]+dp[i-1][j-1][k]*(m-j-k+1))%mod;

表示这一行将之前的一个0个全变成1个有多少种方案

就是由j-1在加上了这个变来得1

 

dp[i][j][k]=(dp[i][j][k]+dp[i-1][j+1][k-1]*(j+1))%mod;

表示这一行将之前的一个1全变成2有多少种方案

由j+1减去了1,k-1加上了1

 

dp[i][j][k]=(dp[i][j][k]+dp[i-1][j-2][k]*calc(m-j-k+2))%mod;

这是将之前的2个0全都变成1

因为可以任取2个,所以运用组合数就是C(m-j-k+2,2)

 

dp[i][j][k]=(dp[i][j][k]+dp[i-1][j+2][k-2]*calc(j+2))%mod;

这是将之前的2个1全变成2

通过组合数同样是C(j+2,2)

 

dp[i][j][k]=(dp[i][j][k]+dp[i-1][j][k-1]*(m-j-k+1)*j)%mod;

这里表示将之前的1个0变成1,一个1变成2

j-1加上当前由0变成的1就是j,再将两个方案乘起来

 

这就是所有的6个方程

代码如下

1 #include 
2 #include
3 #include
4 #include
5 #include
6 using namespace std; 7 typedef long long ll; 8 const ll mod=9999973; 9 const ll N=105;10 ll dp[N][N][N],n,m;11 ll calc(ll x)12 {13 return (x*(x-1)/2)%mod;14 }15 int main()16 {17 scanf("%lld %lld",&n,&m);18 dp[0][0][0]=1;19 for(ll i=1;i<=n;i++)20 for(ll j=0;j<=m;j++)21 for(ll k=0;k<=m-j;k++)22 {23 dp[i][j][k]=(dp[i][j][k]+dp[i-1][j][k])%mod;// 124 if(m-j-k+1>=0 && j>=1)25 dp[i][j][k]=(dp[i][j][k]+dp[i-1][j-1][k]*(m-j-k+1))%mod;// 226 if(j+1>=0 && k>=1)27 dp[i][j][k]=(dp[i][j][k]+dp[i-1][j+1][k-1]*(j+1))%mod;// 328 if(m-j-k+2>=0 && j>=2)29 dp[i][j][k]=(dp[i][j][k]+dp[i-1][j-2][k]*calc(m-j-k+2))%mod;//430 if(j+2>=0 && k>=2)31 dp[i][j][k]=(dp[i][j][k]+dp[i-1][j+2][k-2]*calc(j+2))%mod;// 532 if(m-j-k+1>=0 && k>=1 && j>=1)33 dp[i][j][k]=(dp[i][j][k]+dp[i-1][j][k-1]*(m-j-k+1)*j)%mod;// 634 }35 ll ans=0;36 for(int j=0;j<=m;j++)37 for(int k=0;k+j<=m;k++)38 {39 ans=(ans+dp[n][j][k])%mod;40 }41 printf("%lld\n",ans);42 return 0;43 }

 

转载于:https://www.cnblogs.com/wzrdl/p/9802084.html

你可能感兴趣的文章
CentOS 7更改yum源与更新系统
查看>>
《电脑音乐制作实战指南:伴奏、录歌、MTV全攻略》——2.6 消除卡拉OK视频歌曲原唱...
查看>>
《AngularJS实战》——2.5 本章小结
查看>>
《机器人爱好者(第3辑)》——人工智能需要什么样的计算机?
查看>>
用“Whitespace”编程语言编写无字天书
查看>>
机器人抢工作产生大量闲人 让他们玩游戏过余生?
查看>>
Ruby 元编程:第一部分
查看>>
WannaCry 2.0 已能通过 Wine 感染 Linux 系统
查看>>
五角大楼仍然使用 Windows 95 和 98
查看>>
《Adobe Photoshop CC经典教程(彩色版)》—第4课复习
查看>>
《云计算:概念、技术与架构》一第2章
查看>>
Git@OSC 新增加项目访问统计功能
查看>>
《开源思索集》一开源项目也要讲注意力经济
查看>>
AMD:Windows 上的 Android 另一个支持者
查看>>
《Adobe InDesign CS5中文版经典教程》—第1课1.8节练 习
查看>>
《Spark核心技术与高级应用》——第2章Spark部署和运行
查看>>
为什么程序员跟其他人比起来应该喝更多的水
查看>>
《ANSYS 14有限元分析自学手册》一2.1 坐标系简介
查看>>
《Spring Boot官方指南》(二)入门(一)
查看>>
学习型机器人将首先具备人工智能雏形
查看>>