1801: [Ahoi2009]chess 中国象棋

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 1851  Solved: 1062
[Submit][Status][Discuss]

Description

在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮。 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧.

Input

一行包含两个整数N,M,中间用空格分开.

Output

输出所有的方案数,由于值比较大,输出其mod 9999973

Sample Input

1 3

Sample Output

7

意思就是同一行同一列炮的数量都不超过2个的方案数

dp[i][j][k]表示前i行有j列放了1个炮,k列放了2个炮的情况数

那么分情况讨论就好了

①:不放炮:dp[i][j][k] += dp[i-1][j][k]

②:在没有放炮的列上放1个炮:dp[i][j][k] += dp[i-1][j-1][k]*(m-j+1-k)

③:在放了1个炮的列上再放1个炮:dp[i][j][k] += dp[i-1][j+1][k-1]*(j+1)

④:在两个没有放炮的位置各放1个:dp[i][j][k] += dp[i-1][j-2][k]*C(m-j+2-k, 2)

⑤:在两个放了1个炮的位置各放1个:dp[i][j][k] += dp[i-1][j+2][k-2]*C(j+2, 2)

⑥:在放了1个炮的位置放1个,在没放炮的位置放1个:dp[i][j][k] += dp[i-1][j][k-1]*(m-k+1-j)*j

两道题余数不同其他都一样

#include<stdio.h>
#include<string.h>
long long dp[115][115][115];
#define mod 9999973
int main(void)
{int n, m, i, j, k, ans;while(scanf("%d%d", &n, &m)!=EOF){ans = 0;memset(dp, 0, sizeof(dp));dp[0][0][0] = 1;for(i=1;i<=n;i++){for(j=0;j<=m;j++){for(k=0;j+k<=m;k++){dp[i][j][k] = dp[i-1][j][k];if(j>=1)  dp[i][j][k] = (dp[i][j][k]+dp[i-1][j-1][k]*(m-j+1-k))%mod;if(k>=1)  dp[i][j][k] = (dp[i][j][k]+dp[i-1][j+1][k-1]*(j+1))%mod;if(j>=2)  dp[i][j][k] = (dp[i][j][k]+dp[i-1][j-2][k]*(m-j+2-k)*(m-j+1-k)/2)%mod;if(k>=2)  dp[i][j][k] = (dp[i][j][k]+dp[i-1][j+2][k-2]*(j+2)*(j+1)/2)%mod;if(k>=1)  dp[i][j][k] = (dp[i][j][k]+dp[i-1][j][k-1]*(m-k+1-j)*j)%mod;}}}for(i=0;i<=m;i++){for(j=0;i+j<=m;j++)ans = (ans+dp[n][i][j])%mod;}printf("%d\n", ans);}return 0;
}

bzoj 1801: [Ahoi2009]chess 中国象棋 bzoj 4806: 炮相关推荐

  1. BZOJ 1801: [Ahoi2009]chess 中国象棋( dp )

    dp(i, j, k)表示考虑了前i行, 放了0个炮的有j列, 放了1个炮的有k列. 时间复杂度O(NM^2) -------------------------------------------- ...

  2. bzoj 1801: [Ahoi2009]chess 中国象棋【dp】

    注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数 然后分情况讨论转移就行了 #include<cstdi ...

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

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

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

    题解: 首先知道一个性质,每一行每一列都最多有两个炮 那么很显然是DP 设F[i][j][k]表示前i行,有j列有一个炮,有k列有两个炮,那么转移式子为 这一行什么都不做:f[i][j][k]=f[i ...

  5. BZOJ 1801 [Ahoi2009]中国象棋(线性动规)(洛谷P2051)

    题意:就是在n*m的格子中放"炮"(中国象棋中的棋子)问有多少种放法,使得没有任意的两个炮相互攻击 思路:我们很容易的得到一列或者一行中最多放下两个炮(我也只能得到这些了,满脑子状 ...

  6. BZOJ 1801 chess 中国象棋

    题意: 在n * m 的棋盘上放"炮",使得任意两个炮都不会互相攻击,求方案数. 题解: 既然是求方案数,那么考虑数学方法和递推,这一道题的限制条件比较麻烦,数学方法不合适,考虑递 ...

  7. BZOJ 1801 AHOI 2009 chess 中国象棋 DP

    题目大意:给出棋盘的大小,问任意行和列放置的棋子都不超过两个有多少种方案. 思路:一个比较麻烦的DP.f[i][j][k]表示到前i行,放置了一个棋子的列为j,放置了两个棋子的列为k的方案数,然后有六 ...

  8. 2017.10.23 chess 中国象棋 思考记录

    这种题的一般解法: 1. 发现状压可以搞,然后发现状态爆炸 2.考虑状态特点,一共只有几种可能的状态 3.考虑可不可以只对状态进行计数 4.离散统计贡献 码: #include<iostream ...

  9. JZOJ 1667【AHOI2009】中国象棋——dp

    题目:https://jzoj.net/senior/#main/show/1667 只注重0.1.2的列有多少个,不注重它们的位置,就能记录了. #include<iostream> # ...

最新文章

  1. 博客摘录:网络管理员的两天
  2. linux系统内核官网,五年26个版本:Linux系统内核全程回顾
  3. ruby hash方法_Ruby中带有示例的Hash.flatten方法
  4. 查询工资最低的3名员工的职工工号、姓名和收入_工资条6个常识必须掌握,事关你的权益!...
  5. 图片类关于实现图片剪切功能的相关类的学习心得
  6. 头文件不应该含有非inline函数或对象的定义
  7. Parser-Free Virtual Try-on via Distilling Appearance Flows代码解析
  8. java jni 生成_利用javah技术生成jni接口的详细步骤 | 学步园
  9. UIImagePickerController本地化控件文字
  10. 位置不可用无法访问E此卷不包含可识别文件系统
  11. 自定义CollapsingToolbaLayout完成可收缩的带头像的Toolbar
  12. ndarray数组基本结构和操作
  13. 新生儿黄疸警惕蚕豆病
  14. 5分钟包你搞懂箱形图分析!
  15. 页面调用Adobe Reader自带的控件实现pdf打印
  16. 转载:Java 关于中文乱码问题的解决方案与经验
  17. 【搜集】Thinkpad T400恢复盘下载 - [iThinkpad 资源]
  18. 【号外】携程变相裁员,员工拉横幅讨薪
  19. [css] 如何使用Font Awesome
  20. vue-babylonjs入门api

热门文章

  1. 零基础学python pdf-Python pdf(零基础入门学习Python)V1.0 最新版
  2. 专科python应届生工资多少-应届生自学Python两个月,为什么找不到工作?
  3. 蝙蝠未能连接到服务器是什么原因,打开蝙蝠侠提示网络异常或者连接不上
  4. 万能倍投计算器工具_一周总结上证A股市盈率14.83倍,这是机会还是风险呢?
  5. python基本判断语句_python两种简洁的条件判断语句写法
  6. Node-require的加载机制
  7. 算法-递归求1-n的阶乘
  8. Web API-定时器
  9. vb怎么自动连接服务器,VB 如何制作连接服务器的进程
  10. ActionScript 3.0 API 中的 Video 类