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

--------------------------------------------------------------------------

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 109;
const int MOD = 9999973;
const int INV = 4999987;
int n, m;
int dp[maxn][maxn][maxn];
inline void upd(int &x, int t) {
if((x += t) >= MOD)
x -= MOD;
}
int main() {
scanf("%d%d", &n, &m);
memset(dp, 0, sizeof dp);
dp[0][m][0] = 1;
for(int i = 1; i <= n; i++)
for(int j = 0; j <= m; j++)
for(int k = 0; k <= m - j; k++) {
int &t = dp[i][j][k];
upd(t, dp[i - 1][j][k]);
if(k) upd(t, (j + 1) * dp[i - 1][j + 1][k - 1] % MOD);
upd(t, (k + 1) * dp[i - 1][j][k + 1] % MOD);
if(k >= 2) upd(t, ll(INV) * (j + 1) * (j + 2) * dp[i - 1][j + 2][k - 2] % MOD);
upd(t, ll(INV) * (k + 1) * (k + 2) * dp[i - 1][j][k + 2] % MOD);
upd(t, ll(k) * (j + 1) * dp[i - 1][j + 1][k] % MOD);
}
int ans = 0;
for(int i = 0; i <= m; i++)
for(int j = 0; j <= m - i; j++)
upd(ans, dp[n][i][j]);
printf("%d\n", ans);
return 0;
}

--------------------------------------------------------------------------

1801: [Ahoi2009]chess 中国象棋

Time Limit: 10 Sec  Memory Limit: 64 MB
Submit: 1172  Solved: 688
[Submit][Status][Discuss]

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

Source

Day2

转载于:https://www.cnblogs.com/JSZX11556/p/5125709.html

BZOJ 1801: [Ahoi2009]chess 中国象棋( dp )相关推荐

  1. bzoj 1801: [Ahoi2009]chess 中国象棋 bzoj 4806: 炮

    1801: [Ahoi2009]chess 中国象棋 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1851  Solved: 1062 [Submi ...

  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. BZOJ 1801 AHOI 2009 chess 中国象棋 DP

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

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

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

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

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

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

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

  8. BZOJ 1801 chess 中国象棋

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

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

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

最新文章

  1. 容器必须设置宽度吗_消防泵必须设置自动巡检柜吗
  2. Xshell连接不上虚拟机Linux系统
  3. Java数据结构 利用双栈实现链表操作
  4. 使用REVERSE INDEX改善大规模数据插入【IMPROVE INSERT STATEMENT USING REVERSE INDEX】
  5. php页面之间传值_php如何在不同页面之间传值
  6. Cesium gltf(1.70)三维人物动画制作
  7. Chrome插件使用IE tab
  8. 工作说明书SOW(Statement Of Work)
  9. 通知:大数据技术架构知识库公开
  10. Error response from daemon: conflict: unable to delete a9ac6b268134 (must be forced) - image is bein
  11. Mysql生成UUID 亲测
  12. media在HTML中作用,web前端:关于css中@media的一些基本使用
  13. vivo计算机的隐藏功能介绍,vivo手机13个隐藏功能介绍,你知道几个?
  14. 语言哲学与计算机语言,20世纪语言哲学和心智哲学的发展走向——以塞尔为例...
  15. mysql的cpu使用率突然增高_mysql cpu使用率过高解决方法
  16. 新基建大热,关服务器什么事?
  17. c语言随机产生100个字母,C语言实现生成1到100随机数的方法
  18. 5、查询所有同学的学生编号、学生姓名、选课总数、所有课程的总成绩
  19. 浏览器批量打开网站在线工具
  20. 使用Rufus工具安装Dell服务器系统操作步骤

热门文章

  1. 用Google XML Sitemaps为你的网站创建Sitemap
  2. DataGridView多线程更新数据的问题的解决办法
  3. sql2008问题大全
  4. 在Mac系统下架设WiFi热点,对比Win7
  5. zip、rar文件格式
  6. [Java] 蓝桥杯ALGO-149 算法训练 5-2求指数
  7. 【Objective-C】java中的interface与Objective-C中的interface的区别
  8. java过滤器应用实例_Servlet过滤器Filter的简单介绍(附示例)
  9. ubuntu内网环境安装zabbix agent
  10. git 远程代码回滚master