[BZOJ1801] 中国象棋 dp
来源:互联网 发布:js中split函数 编辑:程序博客网 时间:2024/05/16 22:25
我们可以考虑到每一列都是互不影响的
于是乎可以定义状态
1. 不填
即
2. 填一个
3. 填两个
#include<iostream> #include<iomanip> #include<algorithm> #include<cstdio> #include<cmath> #include<cstring> #define maxn 150 #define mode 9999973 #define ll long long using namespace std; ll dp[maxn][maxn][maxn],n,m,ans; ll f(int v) { return (v*(v-1)/2)%mode; } int main() { scanf("%lld%lld",&n,&m); dp[1][0][0]=1; dp[1][0][1]=m; dp[1][0][2]=m*(m-1)/2; for(int i=2;i<=n;++i) for(int j=0;j<=m;++j) for(int k=0;k<=m;++k) { if(j+k>m) continue; dp[i][j][k]=dp[i-1][j][k]; if(j>=1) dp[i][j][k]+=dp[i-1][j-1][k+1]*(k+1)%mode; if(k>=1) dp[i][j][k]+=dp[i-1][j][k-1]*(m-j-k+1)%mode; if(j>=2) dp[i][j][k]+=dp[i-1][j-2][k+2]*f(k+2)%mode; if(k>=2) dp[i][j][k]+=dp[i-1][j][k-2]*f(m-j-k+2)%mode; if(j>=1) dp[i][j][k]+=dp[i-1][j-1][k]*k%mode*(m-k-j+1); } for(int i=0;i<=m;++i) for(int j=0;j<=m;++j) { if(i+j>m) continue; ans=(ans+dp[n][i][j])%mode; } cout<<ans<<endl; return 0; }
阅读全文
0 0
- [BZOJ1801] 中国象棋 dp
- Bzoj1801:[Ahoi2009]chess 中国象棋:dp
- bzoj1801 [Ahoi2009]chess 中国象棋 DP
- [DP] BZOJ1801: [Ahoi2009]chess 中国象棋
- bzoj1801: [Ahoi2009]chess 中国象棋(Dp)
- BZOJ1801: [Ahoi2009]chess 中国象棋
- [BZOJ1801][Ahoi2009]chess 中国象棋
- bzoj1801【AHOI2009】chess 中国象棋
- BZOJ1801: [Ahoi2009]chess 中国象棋
- BZOJ1801: [Ahoi2009]chess 中国象棋
- bzoj1801: [Ahoi2009]chess 中国象棋
- bzoj1801: [Ahoi2009]chess 中国象棋
- BZOJ1801 Ahoi2009 chess 中国象棋
- 12.9 bzoj1801 [Ahoi2009]chess 中国象棋
- 【bzoj1801】【AHOI2009】【chess中国象棋】【组合数学】
- 【BZOJ1801】【AHOI2009】中国象棋(动态规划)
- bzoj1801(dp棋盘上方案dp)
- AHOI2009中国象棋--巧妙dp
- Tomcat集群session复制与Oracle的坑。。
- 第三方频道管理
- Tengine-Ngnix高级版
- Java中创建String的两道面试题及详解
- Maven精选系列--classifier元素妙用
- [BZOJ1801] 中国象棋 dp
- Spring Boot Debug调试
- nodemcu,esp8266,esp32下载工具
- 分享一套分布式架构设计视频教程
- 记PAM250矩阵的自乘
- 基于Cmd Markdown编辑阅读器的Markdown入门
- 使用spring连接及操作mongodb3.0
- Java类初始化顺序,大神3个示例带你躺坑。。
- android好看的加载动画