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个,使得没有任何一个炮可以攻击另一个炮. 请 ...
随机推荐
- jmeter-负载
主: remote_hosts=10.0.70.35:1099,10.0.70.47:1099 server.rmi.localport=1099 从: remote_hosts=10.0.70.3 ...
- 关于java 线程池 ThreadPoolExceutor 之 TestDemo
public class App { public static void main(String[] args) throws InterruptedException { System.out.p ...
- 使用GEOquery下载GEO数据--转载
最近需要下载一大批GEO上的数据,问题是我要下载的Methylation数据根本就没有sra文件,换言之不能使用Aspera之类的数据进行下载.但是后来我发现了GEOquery这个不错的R包,不知道是 ...
- string与位运算
1.String String a="abc"; 会在常量池中开辟一个空间,保存"abc" String b=new String("abc&q ...
- Tomcat 的context.xml说明、Context标签讲解
Tomcat的context.xml说明.Context标签讲解 1. 在tomcat 5.5之前 --------------------------- Context体现在/conf/server ...
- 使用maven插件自动部署web应用至Docker容器的tomcat
配置maven 在pom.xml加入 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 <plugins> <plugin> <gr ...
- 河南省多校联盟二-F 线段树+矩阵
---恢复内容开始--- 1284: SP教数学 时间限制: 2 秒 内存限制: 128 MB提交: 24 解决: 4 题目描述 输入 输出 对于每组数据的2操作,输出一行对1e9 + 7取模的答 ...
- JWT(JSON Web Token) Java与.Net简单编码实现
参考 JWT(JSON WEB TOKENS)-一种无状态的认证机制 基于Token的WEB后台认证机制 各种语言版本的基于HMAC-SHA256的base64加密 Java与.Net实现实现 // ...
- 【Error】SSL InsecurePlatform error when using Requests package
使用requests时会出席SSL InsecurePlatform error when using Requests package的错误,一般情况下python2.7.10以下的环境会出现此错误 ...
- 从HDC转换到leptonica PIX
void CAssistDlg::OnBnClickedTest() { HDC hdc = ::GetDC(NULL); HDC hdcMem = CreateCompatibleDC(hdc); ...