【BZOJ1801】【DTOJ2004】 [Ahoi2009]chess 中国象棋 【DP】
2024-10-07 15:21:39
题解:
首先知道一个性质,每一行每一列都最多有两个炮
那么很显然是DP
设F[i][j][k]表示前i行,有j列有一个炮,有k列有两个炮,那么转移式子为
这一行什么都不做:f[i][j][k]=f[i-1][j][k]
这一行填一个炮在列为0:f[i][j][k]=f[i-1][j-1][k]*c(m-j-k+1,1)
这一行填一个炮在列为1:f[i][j][k]=f[i-1][j+1][k-1]*c(j+1,1)
这一行填两个炮在列为0:f[i][j][k]=f[i-1][j-2][k]*c(m-j-k+2,2)
这一行填一个炮在列为0一个炮在列为1:f[i][j][k]=f[i-1][j][k-1]*c(j,1)*c(m-j-k+1,1)
这一行填两个炮在列为1:f[i][j][k]=f[i-1][j+2][k-2]*c(j+2,2)
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#define mod 9999973
#define ll long long
using namespace std;
int n,m,ans;
int f[][][],c[][];
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=;i++)c[i][]=;
for(int i=;i<=;i++)
for(int j=;j<=i;j++)c[i][j]=(c[i-][j-]+c[i-][j])%mod;
f[][][]=;
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
for(int k=;j+k<=m;k++)
{
f[i][j][k]=f[i-][j][k];
if(j>=)f[i][j][k]=(f[i][j][k]+(ll)f[i-][j-][k]*c[m-j-k+][]%mod)%mod;
if(k>= && j+<=m)f[i][j][k]=(f[i][j][k]+(ll)f[i-][j+][k-]*c[j+][]%mod)%mod;
if(j>=)f[i][j][k]=(f[i][j][k]+(ll)f[i-][j-][k]*c[m-j-k+][]%mod)%mod;
if(j>= && k>=)f[i][j][k]=(f[i][j][k]+(ll)f[i-][j][k-]*c[j][]%mod*c[m-j-k+][]%mod)%mod;
if(k>= && j+<=m)f[i][j][k]=(f[i][j][k]+(ll)f[i-][j+][k-]*c[j+][])%mod;
}
for(int i=;i<=m;i++)
for(int j=;j<=m;j++)ans=(ans+f[n][i][j])%mod;
return !printf("%d\n",ans);
}
最新文章
- Web前端上万字的知识总结
- ARCGIS如何进行可视域分析
- Struts2中Action取得表单数据的几种方法
- word-wrap: break-word; break-word: break-all;区别
- codemirror和ace editor的语法高亮
- JSP 处理汉字信息
- AD7715
- java web 之 web.xml篇
- Ionic Android开发环境搭建 上
- 学习PHP时的一些总结(二)
- jquery 弹出框 showDialog.js具体用法
- BZOJ:4031: [HEOI2015]小Z的房间
- flask模板
- jdbcTemplate批量插入处理数据
- 一文教你看懂大数据的技术生态圈:Hadoop,hive,spark
- 2018-11-04 在线代码离线翻译Chrome插件";一马";v0.0.14
- Python多进程、多线程、协程
- 根据字体多少使UILabel自动调节尺寸
- Jpa实体类生成图解
- Nginx教程(6) 负载均衡