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 中国象棋的更多相关文章

  1. BZOJ1801 Ahoi2009 chess 中国象棋 【DP+组合计数】*

    BZOJ1801 Ahoi2009 chess 中国象棋 Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行 ...

  2. BZOJ1801 [Ahoi2009]chess 中国象棋(DP, 计数)

    题目链接 [Ahoi2009]chess 中国象棋 设$f[i][j][k]$为前i行,$j$列放了1个棋子,$k$列放了2个棋子的方案数 分6种情况讨论,依次状态转移. #include <b ...

  3. bzoj1801: [Ahoi2009]chess 中国象棋(DP)

    1801: [Ahoi2009]chess 中国象棋 题目:传送门 题解: 表示自己的DP菜的抠脚 %题解... 定义f[i][j][k]表示前i行 仅有一个棋子的有j列 有两个棋子的有k个 的方案数 ...

  4. [luogu2051][bzoj1801][AHOI2009]chess中国象棋【动态规划】

    题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...

  5. BZOJ1801 [Ahoi2009]chess 中国象棋 动态规划

    欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1801 题意概括 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请 ...

  6. BZOJ1801:[Ahoi2009]chess 中国象棋

    Time Limit: 10 Sec  Memory Limit: 64 MB Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置 ...

  7. bzoj1801: [Ahoi2009]chess 中国象棋 dp

    题意:在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. 题解:dp[i][j][k]表示到了第i行,有j列 ...

  8. BZOJ1801 [Ahoi2009]chess 中国象棋 【dp】

    题目 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. 输入格式 一行包含两个整数N,M,中间用空格分开. ...

  9. bzoj1801[AHOI2009]CHESS中国象棋

    题意:在棋盘上放一些炮使得它们不互相攻击.其实就是一行/一列最多放两个. 50分的数据中n,m至少有一个不超过8,比较直接的想法是对n/m中较小的一维做状态压缩,状态f[i][S1][S2]表示在前i ...

  10. 【BZOJ1801】[Ahoi2009]chess 中国象棋 DP

    [BZOJ1801][Ahoi2009]chess 中国象棋 Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮 ...

随机推荐

  1. 人工智能AI芯片与Maker创意接轨 (中)

    在人工智能AI芯片与Maker创意接轨(上)这篇文章中,介绍人工智能与深度学习,以及深度学习技术的应用,了解内部真实的作业原理,让我们能够跟上这波AI新浪潮.系列文来到了中篇,将详细介绍目前市面上的各 ...

  2. 通过扩展方法简化UnityAPI调用

    通过扩展方法简化UnityAPI调用 扩展方法unity apiapi简化 通过扩展方法简化UnityAPI调用 能省一秒是一秒,时间就是金钱,没人愿意把时间花在冗长的coding上

  3. SQL Server复制

    SQL Server复制的阶梯:级别1-SQL Server复制介绍 By Sebastian Meine, 2012/12/26 原文链接:http://www.sqlservercentral.c ...

  4. Linux系统下安装jdk1.8

    JDK安装分为两种方式  一种是解压tar.gz配置安装, 一种是rpm安装,我这里是tar.gz安装方式 一.首先在oracle官方网下载jdk,网址如下:http://www.oracle.com ...

  5. 配置Tomcat使用HTTP/2

    转自: https://zhuanlan.zhihu.com/p/21349186 前情提要: Tomcat高效响应的秘密(一) Sendfile与Gzip Tomcat高效响应的秘密(二) keep ...

  6. API验证

    API验证说明 API验证: a. 发令牌: 静态 PS: 隐患 key被别人获取 b. 动态令牌 PS: (问题越严重)用户生成的每个令牌被黑客获取到,都会破解 c. 高级版本 PS: 黑客网速快, ...

  7. ES6的新特性(23)——ArrayBuffer

    ArrayBuffer ArrayBuffer对象.TypedArray视图和DataView视图是 JavaScript 操作二进制数据的一个接口.这些对象早就存在,属于独立的规格(2011 年 2 ...

  8. 在 Linux 下执行安装 bin 文件

    原文: http://www.linuxidc.com/Linux/2014-03/98541.htm

  9. TFS任务预览

    不太熟悉TFS任务项的建立. 初步建立及按老师要求分配到个人的任务设置与时间安排如下: (长时间任务可由多人合作完成,具体根据情况迅速调整任务分配) 加上每人需要进行阅读前一小组的代码需要时间2*8= ...

  10. Daily Srum 10.21

    到目前为止,我们组处在学习阶段,很多知识点都还不太清楚,所以现在我们还在看相关书籍和博客,任务. 而我们此间主要是在阅读一些材料: 陈谋一直在看学长的代码,其中C#的很多方式我都不太明白(尽管和Jav ...