BZOJ1801 Ahoi2009 chess 中国象棋 【DP+组合计数】*
BZOJ1801 Ahoi2009 chess 中国象棋
Description
在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮。 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧.
Input
一行包含两个整数N,M,中间用空格分开.
Output
输出所有的方案数,由于值比较大,输出其mod 9999973
Sample Input
1 3
Sample Output
7
HINT
除了在3个格子中都放满炮的的情况外,其它的都可以.
100%的数据中N,M不超过100
50%的数据中,N,M至少有一个数不超过8
30%的数据中,N,M均不超过6
不难发现每行每列最多只有2个棋子
考虑DP,dpi,j,kdp_{i,j,k}dpi,j,k表示i行中一共有j列有一个,k列有两个
然后我们考虑这一行选多少
- 当前行不选
dpi,j,k=dpi−1,j,k - 当前行选一个
- 选原来是0个棋子dp(i,j,k)+=dp(i−1,j−1,k)∗c(n−k−j+1,1)(1≤j)
- 选原来是1个棋子dp(i,j,k)+=dp(i−1,j+1,k−1)∗c(j+1,1)(1≤k,j≤m−1)
- 当前行选两个
- 选两个原来是0的dp(i,j,k)+=dp(i−1,j−2,k)*c(m-j-k+1,2)(2≤j)
- 选两个原来是1的dp(i,j,k)+=dp(i−1,j+2,k−2)*c(j+2,2)(2≤k,j≤m−2)
- 选一个是1一个是0 dp(i,j,k)+=dp(i−1,j,k−1)*j*(m-j-k+1)(1≤j,1≤k(要保证原来有1))
然后就可以进行转移了
#include<bits/stdc++.h>
using namespace std;
#define fu(a,b,c) for(int a=b;a<=c;++a)
#define fd(a,b,c) for(int a=b;a>=c;--a)
#define N 110
#define LL long long
#define Mod 9999973
LL c[N][N];
LL dp[N][N][N]={};
int n,m;
void getc(){
fu(i,,N-)c[i][]=;
fu(i,,N-)
fu(j,,i)c[i][j]=(c[i-][j]+c[i-][j-])%Mod;
}
LL mul(LL a,LL b){return a*b%Mod;}
int main(){
getc();
dp[][][]=;
scanf("%d%d",&n,&m);
if(n<m)swap(n,m);
fu(i,,n)
fu(j,,m)
fu(k,,m-j){
dp[i][j][k]=dp[i-][j][k];
if(j)dp[i][j][k]+=mul(dp[i-][j-][k],c[m-j-k+][]);
if(j&&k)dp[i][j][k]+=mul(dp[i-][j][k-],mul(j,m-j-k+));
if(j>=)dp[i][j][k]+=mul(dp[i-][j-][k],c[m-j-k+][]);
if(k>=&&j<=m-)dp[i][j][k]+=mul(dp[i-][j+][k-],c[j+][]);
if(k>=&&j<=m-)dp[i][j][k]+=mul(dp[i-][j+][k-],c[j+][]);
dp[i][j][k]%=Mod;
}
int ans=;
fu(i,,m)
fu(j,,m-i)
ans=(ans+dp[n][i][j])%Mod;
printf("%d",ans);
return ;
}
BZOJ1801 Ahoi2009 chess 中国象棋 【DP+组合计数】*的更多相关文章
- BZOJ 1801: [Ahoi2009]chess 中国象棋 [DP 组合计数]
http://www.lydsy.com/JudgeOnline/problem.php?id=1801 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放 ...
- bzoj1801: [Ahoi2009]chess 中国象棋 dp
题意:在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. 题解:dp[i][j][k]表示到了第i行,有j列 ...
- BZOJ1801 [Ahoi2009]chess 中国象棋(DP, 计数)
题目链接 [Ahoi2009]chess 中国象棋 设$f[i][j][k]$为前i行,$j$列放了1个棋子,$k$列放了2个棋子的方案数 分6种情况讨论,依次状态转移. #include <b ...
- 【BZOJ1801】[Ahoi2009]chess 中国象棋 DP
[BZOJ1801][Ahoi2009]chess 中国象棋 Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮 ...
- bzoj1801: [Ahoi2009]chess 中国象棋(DP)
1801: [Ahoi2009]chess 中国象棋 题目:传送门 题解: 表示自己的DP菜的抠脚 %题解... 定义f[i][j][k]表示前i行 仅有一个棋子的有j列 有两个棋子的有k个 的方案数 ...
- BZOJ 1801: [Ahoi2009]chess 中国象棋( dp )
dp(i, j, k)表示考虑了前i行, 放了0个炮的有j列, 放了1个炮的有k列. 时间复杂度O(NM^2) -------------------------------------------- ...
- [luogu2051][bzoj1801][AHOI2009]chess中国象棋【动态规划】
题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...
- BZOJ1801 [Ahoi2009]chess 中国象棋 【dp】
题目 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. 输入格式 一行包含两个整数N,M,中间用空格分开. ...
- BZOJ1801 [Ahoi2009]chess 中国象棋 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1801 题意概括 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请 ...
随机推荐
- ubuntu16.04 安装power shell
ubuntu16.04 安装power shell # Download the Microsoft repository GPG keys wget -q https://packages.micr ...
- 在activity之间传递数据
在activity之间传递数据 一.简介 二.通过intent传递数据 1.在需要传数据的界面调用 intent.putExtra("data1", "我是fry&quo ...
- JSP 连接数据库
本章节假设您已经对JDBC有一定的了解.在开始学习JSP数据库访问前,请确保JDBC环境已经正确配置. 首先,让我们按照下面的步骤来创建一个简单的表并插入几条简单的记录: 创建表 在数据库中创建一个E ...
- git命令速记
对于不常写代码,有的时候又要提交点代码的人来说,git命令记了又忘,忘了又去花精力记住.有没有一种速记方法,来帮助我们记忆这些玩意呢? 纯属抄袭@_@! 除了几个很基本的命令,复杂一点的,我都要去查, ...
- 关于.net4.0中的Action委托
在使用委托时,若封装的方法无返回值,并且参数在0-7个,可考虑使用.Net4.0中的Action委托,建议使用系统自带的,减少自定义 public delegate void Action<in ...
- ubuntu 安装包过程中遇到的一个错误解决办法
错误提示如下: 将会安装下列额外的软件包: libdigest-hmac-perl libqt5test5下列[新]软件包将被安装: libdigest-hmac-perl下列软件包将被升级: lib ...
- Android----- MD5加密(登录注册得到与IOS相同的加密值,并且解决两个平台汉字加密不相同问题)
最近开发项目中遇到一个这样的问题,注册和登录时需要对信息MD5加密生成一个Token传给后台, 后台会对信息进行比较加密是否相同,才表示你登录或者注册成功,所以,IOS和Android两个平台的tok ...
- Python实现CSV数据的读取--两种方法实现
方法一: 方法二:
- flask学习(九):模板渲染和参数传递
一. 如何渲染模板 1. 模板放在templates文件夹下 2. 从flask中导入render_template函数 3. 在视图函数中,使用render_template函数,渲染模板 注意:只 ...
- 普通for循环遍历LinkedList弊端
java开发过程中,用到的最多的List集合就属ArrayList与LinkedList.对于ArrayList的遍历,通常是下面的方法: public static void main(String ...