【BZOJ1801】【Ahoi2009】chess 中国象棋
Time Limit: 10 Sec Memory Limit: 64 MB
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
Solution
这题的关键在于设置状态。
前面的数据范围很容易让人联想到状态压缩,但是这反而不利于解题。
考虑题目的本质是什么,其实是求在一个矩阵中放置每行不超过2个、每列不超过2个元素的方案数。
还是一行一行地计算,如何记录每列能不能放置一个新的元素?
观察到每一列元素的数量只可能是0或1或2,每列元素的数量也有重要意义:如果已有2个,则这列不可再考虑。否则还可以考虑在这行的这列的位置加一个元素。这个状态很方便记录。
那就设\(f[i][a_1][a_2]\)表示当前考虑到第\(i\)行,有\(m-a_1-a_2\)列还是空的,有\(a_1\)列已经有一个元素,有\(a_2\)列已经放好两个元素。
转移也是显然的,因为每行最多放置两个元素,所以一共只有五种简单的转移。每种已有元素相同的列其实本质上是一样的,暴力考虑一下就可以了。
#include <cstdio>
using namespace std;
const int N=105,MOD=9999973;
int n,m;
int f[N][N][N];
inline int C2(int n){
if(n<=1) return 0;
return (1LL*n*(n-1)/2)%MOD;
}
int main(){
freopen("input.in","r",stdin);
scanf("%d%d",&n,&m);
f[0][0][0]=1;
for(int i=0;i<n;i++)
for(int a1=0;a1<=m;a1++)
for(int a2=m-a1;a2>=0;a2--)
if(f[i][a1][a2]){
(f[i+1][a1][a2]+=f[i][a1][a2])%=MOD;
int a0=m-a1-a2;
if(a1+a2+1<=m)
(f[i+1][a1+1][a2]+=1LL*a0*f[i][a1][a2]%MOD)%=MOD;
if(a1+a2+2<=m)
(f[i+1][a1+2][a2]+=1LL*C2(a0)*f[i][a1][a2]%MOD)%=MOD;
if(a1>=1)
(f[i+1][a1-1][a2+1]+=1LL*a1*f[i][a1][a2]%MOD)%=MOD;
if(a1>=2)
(f[i+1][a1-2][a2+2]+=1LL*C2(a1)*f[i][a1][a2]%MOD)%=MOD;
if(a1+a2+1<=m)
(f[i+1][a1][a2+1]+=1LL*a0*a1%MOD*f[i][a1][a2]%MOD)%=MOD;
}
int ans=0;
for(int a1=0;a1<=m;a1++)
for(int a2=m-a1;a2>=0;a2--)
(ans+=f[n][a1][a2])%=MOD;
printf("%d\n",ans);
return 0;
}
【BZOJ1801】【Ahoi2009】chess 中国象棋的更多相关文章
- BZOJ1801 Ahoi2009 chess 中国象棋 【DP+组合计数】*
BZOJ1801 Ahoi2009 chess 中国象棋 Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行 ...
- BZOJ1801 [Ahoi2009]chess 中国象棋(DP, 计数)
题目链接 [Ahoi2009]chess 中国象棋 设$f[i][j][k]$为前i行,$j$列放了1个棋子,$k$列放了2个棋子的方案数 分6种情况讨论,依次状态转移. #include <b ...
- bzoj1801: [Ahoi2009]chess 中国象棋(DP)
1801: [Ahoi2009]chess 中国象棋 题目:传送门 题解: 表示自己的DP菜的抠脚 %题解... 定义f[i][j][k]表示前i行 仅有一个棋子的有j列 有两个棋子的有k个 的方案数 ...
- [luogu2051][bzoj1801][AHOI2009]chess中国象棋【动态规划】
题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...
- BZOJ1801 [Ahoi2009]chess 中国象棋 动态规划
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1801 题意概括 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请 ...
- BZOJ1801:[Ahoi2009]chess 中国象棋
Time Limit: 10 Sec Memory Limit: 64 MB Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置 ...
- bzoj1801: [Ahoi2009]chess 中国象棋 dp
题意:在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. 题解:dp[i][j][k]表示到了第i行,有j列 ...
- BZOJ1801 [Ahoi2009]chess 中国象棋 【dp】
题目 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. 输入格式 一行包含两个整数N,M,中间用空格分开. ...
- bzoj1801[AHOI2009]CHESS中国象棋
题意:在棋盘上放一些炮使得它们不互相攻击.其实就是一行/一列最多放两个. 50分的数据中n,m至少有一个不超过8,比较直接的想法是对n/m中较小的一维做状态压缩,状态f[i][S1][S2]表示在前i ...
- 【BZOJ1801】[Ahoi2009]chess 中国象棋 DP
[BZOJ1801][Ahoi2009]chess 中国象棋 Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮 ...
随机推荐
- 图形 - bootStrap4常用CSS笔记
.rounded 图片显示圆角效果 .rounded-circle 设置椭圆形图片 .img-thumbnail 设置图片缩略图(图片有边框) .img-fluid 响应式图片 .float-righ ...
- Gitlab CI-3.遇到的问题
五.遇到的问题 1. cannot validate certificate for x.x.x.x because it doesn't contain any IP SANs 报错信息:ERROR ...
- JS模块化样例
var fn_pageBtn = (function(){ var m1 = function(){ alert(1); }; var m2 = function(){ alert(2); }; re ...
- React Native移动开发实战-5-Android平台的调试技巧
Android平台的调试和其他平台的调试也很类似,例如:在Android Studio打开的工程中,打开源码MainActivity.java,然后,将鼠标移至代码编辑区的左侧后,单击鼠标即可添加断点 ...
- Centos7 zabbix 分布式监控
分布式监控 zabbix Server ===> zabbix agent (只能同一个局域网监控) 分布式监控: a. 分担压力,降低负载 b. 多机房 ...
- Buaaclubs的NABC与发布
NEED: 本项目主要目的是实现一个社团学生公共平台,平台的宗旨是为学生提供信息,为社团提供服务,在社团和学生之间建立联系.经过调查,我们发现了用户的以下需求: 需求一:社团发布信息,同学获知信息 这 ...
- Chapter 9 软件实现
软件实现包括代码设计.设计审查.代码编写.代码走查.代码编译和单元测试等活动.程序设计语言有很多,从机器语言到高级语言一直发展.软件编码需要遵循一些规范,JAVA代码有适当的空行,代码行及行内空格.分 ...
- 超级迷宫之NABCD
模式之一:双人模式 N:基于双人之间的竞争与协作,朋友之间可以有一个竞争比赛,一决高下,男女朋友之间适合双人协作模式,共同完成游戏. A:双人竞争模式为双人同起点或不同起点来进行游戏,在竞争的紧张压力 ...
- NetFPGA-SUME下reference_nic测试
Reference_nic Reference_nic是NetFPGA-SUME中提供的一个参考Demo,本文主要介绍如何构建并在SUME上运行reference_nic. GIT源 git clon ...
- SQL语句中 chinese_prc_CS_AI_WS 以及replace用法
Select * from [DBData].[dbo].[T_Student] where Name='lilei' 查询结果如下: 结论:由查询结果可知 SQL Server ...