题目描述

这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法。大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子。你也来和小可可一起锻炼一下思维吧!

输入输出格式

输入格式:

一行包含两个整数N,M,之间由一个空格隔开。

输出格式:

总共的方案数,由于该值可能很大,只需给出方案数模9999973的结果。

输入输出样例

输入样例#1:
复制

  1. 1 3
输出样例#1: 复制

  1. 7

说明

样例说明

除了3个格子里都塞满了炮以外,其它方案都是可行的,所以一共有2*2*2-1=7种方案。

数据范围

100%的数据中N和M均不超过100

50%的数据中N和M至少有一个数不超过8

30%的数据中N和M均不超过6

考验思维的一道dp;

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<string>
  7. #include<cmath>
  8. #include<map>
  9. #include<set>
  10. #include<vector>
  11. #include<queue>
  12. #include<bitset>
  13. #include<ctime>
  14. #include<time.h>
  15. #include<deque>
  16. #include<stack>
  17. #include<functional>
  18. #include<sstream>
  19. //#include<cctype>
  20. //#pragma GCC optimize(2)
  21. using namespace std;
  22. #define maxn 200005
  23. #define inf 0x7fffffff
  24. //#define INF 1e18
  25. #define rdint(x) scanf("%d",&x)
  26. #define rdllt(x) scanf("%lld",&x)
  27. #define rdult(x) scanf("%lu",&x)
  28. #define rdlf(x) scanf("%lf",&x)
  29. #define rdstr(x) scanf("%s",x)
  30. #define mclr(x,a) memset((x),a,sizeof(x))
  31. typedef long long ll;
  32. typedef unsigned long long ull;
  33. typedef unsigned int U;
  34. #define ms(x) memset((x),0,sizeof(x))
  35. const long long int mod = 9999973;
  36. #define Mod 1000000000
  37. #define sq(x) (x)*(x)
  38. #define eps 1e-5
  39. typedef pair<int, int> pii;
  40. #define pi acos(-1.0)
  41. //const int N = 1005;
  42. #define REP(i,n) for(int i=0;i<(n);i++)
  43. typedef pair<int, int> pii;
  44.  
  45. inline int rd() {
  46. int x = 0;
  47. char c = getchar();
  48. bool f = false;
  49. while (!isdigit(c)) {
  50. if (c == '-') f = true;
  51. c = getchar();
  52. }
  53. while (isdigit(c)) {
  54. x = (x << 1) + (x << 3) + (c ^ 48);
  55. c = getchar();
  56. }
  57. return f ? -x : x;
  58. }
  59.  
  60. ll gcd(ll a, ll b) {
  61. return b == 0 ? a : gcd(b, a%b);
  62. }
  63. int sqr(int x) { return x * x; }
  64.  
  65. /*ll ans;
  66. ll exgcd(ll a, ll b, ll &x, ll &y) {
  67. if (!b) {
  68. x = 1; y = 0; return a;
  69. }
  70. ans = exgcd(b, a%b, x, y);
  71. ll t = x; x = y; y = t - a / b * y;
  72. return ans;
  73. }
  74. */
  75.  
  76. int n, m, ans;
  77. ll dp[200][200][200];
  78. int C(int x) {
  79. return (x*(x - 1) / 2) % mod;
  80. }
  81. int main()
  82. {
  83. // ios::sync_with_stdio(0);
  84. n = rd(); m = rd();
  85. dp[0][0][0] = 1;
  86. for (int i = 1; i <= n; i++) {
  87. for (int j = 0; j <= m; j++) {
  88. for (int k = 0; k + j <= m; k++) {
  89. dp[i][j][k] = dp[i - 1][j][k];
  90. if (k >= 1) {
  91. dp[i][j][k] =1ll* (dp[i][j][k] + dp[i - 1][j + 1][k - 1] * (j + 1));
  92. }
  93. if (j >= 1) {
  94. dp[i][j][k] = 1ll*(dp[i][j][k] + dp[i - 1][j - 1][k] * (m - (j - 1) - k));
  95. }
  96. if (k >= 2) {
  97. dp[i][j][k] = 1ll*(dp[i][j][k] + dp[i - 1][j + 2][k - 2] * ((j + 2)*(j + 1) / 2));
  98. }
  99. if (k >= 1) {
  100. dp[i][j][k] = 1ll*(dp[i][j][k] + dp[i - 1][j][k - 1] * j*(m - (k - 1) - j));
  101. }
  102. if (j >= 2) {
  103. dp[i][j][k] = 1ll*(dp[i][j][k] + dp[i - 1][j - 2][k] * C(m - (j - 2) - k));
  104. }
  105. dp[i][j][k] %= 1ll*mod;
  106. }
  107. }
  108. }
  109. // int ans = 0;
  110. for (int i = 0; i <= m; i++) {
  111. for (int j = 0; j <= m; j++) {
  112. ans = 1ll*(ans + dp[n][i][j]) % mod;
  113. }
  114. }
  115. printf("%lld\n", 1ll * ans%mod);
  116. return 0;
  117. }

[AHOI2009]中国象棋 BZOJ1801 dp的更多相关文章

  1. 【洛谷 P2051】 [AHOI2009]中国象棋(DP)

    题目链接 首先想到状压dp,但是\(n,m\)高达100,怎么压? 容易发现,每行每列最多两个象棋,否则就直接gg了. 一个巧妙的设置状态的方式是,只需要记录到当前行有多少列是放了1个炮和2个炮. 然 ...

  2. P2051 [AHOI2009]中国象棋 大力DP

    状压个啥$qwq$ 思路:大力$DP$ 提交:2次(自信的开了$int$) 题解:(见注释) #include<cstdio> #include<iostream> using ...

  3. P2051 [AHOI2009]中国象棋[线性DP]

    最近智商有点不在线.其实一直不在线. 题目 先是想用$f[i][j][k][0/1/2]$表示摆了i行时有j列空着,k列有了一个炮,且当下摆了0/1/2个的状态,转移方程写的出来但是极其繁琐.于是又设 ...

  4. [luoguP2051] [AHOI2009]中国象棋(DP)

    传送门 注释写明了一切 #include <cstdio> #define N 111 #define p 9999973 #define LL long long int n, m; L ...

  5. Luogu P2051[AHOI2009]中国象棋【dp】By cellur925

    题目传送门 题目大意:给定一个$n*m$的棋盘,求放三个“炮”使它们不共行也不共列的方案数.($n,m$$<=100$) 这题主要是转移比较困难,因为情况比较多,所以需要冷静大胆细心地进行分情况 ...

  6. 洛谷 P2051 [AHOI2009]中国象棋 状态压缩思想DP

    P2051 [AHOI2009]中国象棋 题意: 给定一个n*m的空棋盘,问合法放置任意多个炮有多少种情况.合法放置的意思是棋子炮不会相互打到. 思路: 这道题我们可以发现因为炮是隔一个棋子可以打出去 ...

  7. Luogu P2051 [AHOI2009]中国象棋(dp)

    P2051 [AHOI2009]中国象棋 题面 题目描述 这次小可可想解决的难题和中国象棋有关,在一个 \(N\) 行 \(M\) 列的棋盘上,让你放若干个炮(可以是 \(0\) 个),使得没有一个炮 ...

  8. [Luogu P2051] [AHOI2009]中国象棋 (状压DP->网格DP)

    题面 传送门:https://www.luogu.org/problemnew/show/P2051 Solution 看到这题,我们不妨先看一下数据范围 30pt:n,m<=6 显然搜索,直接 ...

  9. 洛谷 P2051 [AHOI2009]中国象棋 解题报告

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

随机推荐

  1. @RequestParam注解的作用

    1.这个注解是干什么的??? 提取和解析请求参数的能力. 2.实例解析: a.代码 @Controller @RequestMapping("/pets") @SessionAtt ...

  2. SpringMVC简单的文件上传

    引入依赖包: <!-- 文件上传的依赖 --> <dependency> <groupId>commons-fileupload</groupId> & ...

  3. Nginx 下配置Laravel 错误404

    宝塔的访问路径改一下 在站点的配置文件下面server里面加上 location / { try_files $uri $uri/ /index.php?$query_string; } 然后重启Ng ...

  4. PyV8在服务端运行自动崩溃问题

    近来想在服务端架设WSGI + PyV8去自动解析JavaScript代码,然后返回解析后的数据给客户端.但是发现,在nginx配置后,客户端一请求,服务端的python脚本自动崩溃. 见代码: de ...

  5. c++模板实现 linq

    // ConsoleApplication32.cpp : 定义控制台应用程序的入口点. // #include "stdafx.h" using namespace std; # ...

  6. python23种设计模式

      第一篇 Python与设计模式:前言 第二篇(23种设计模式) 创建类设计模式(5种) 单例模式.工厂模式.简单工厂模式.抽象工厂模式.建造者模式.原型模式 结构类设计模式(7种) 代理模式.装饰 ...

  7. Eclipse工具

    1 ArrayList的常见方法 * a: add(参数) 向集合中添加元素 * b: get(int index) 取出集合中的元素,get方法的参数,写入索引 * c: size() 返回集合的长 ...

  8. UIWebView分页显示

    問題:使用iOS UIWebView時,載入本地html檔案,但是該檔案太大,結果螢幕畫面形成一長條型顯示,雖然用滾動畫面可以看見整個html檔案,但是滑來滑去,不好用. 目標:用UIWebView載 ...

  9. MongoDB整理笔记のCRUD

    添加 下面我们来建立一个test 的集合并写入一些数据.建立两个对象j 和t , 并保存到集合中去.在例子里 “>” 来表示是 shell 输入提示符    > j = { name : ...

  10. 关于winform的appconfig的读写操作

    public string ReadConfig() { List<string> list = new List<string>(); ExeConfigurationFil ...