传送门

注释写明了一切

  1. #include <cstdio>
  2. #define N 111
  3. #define p 9999973
  4. #define LL long long
  5.  
  6. int n, m;
  7. LL ans, f[N][N][N];
  8.  
  9. //每一行和每一列可以放0/1/2个炮
  10. //f[i][j][k]表示前i行放了1个炮的列有j个,放了2个炮的列有k个的方案数
  11. //那么可以推出,放了0个炮的列有m-j-k个
  12.  
  13. inline int C(int x)
  14. {
  15. return x * (x - 1) / 2;
  16. }
  17.  
  18. int main()
  19. {
  20. int i, j, k, l;
  21. scanf("%d %d", &n, &m);
  22. f[0][0][0] = 1;
  23. for(i = 1; i <= n; i++)
  24. for(j = 0; j <= m; j++)
  25. for(k = 0; k <= m - j; k++)
  26. {
  27. //当前这一行不放炮
  28. f[i][j][k] += f[i - 1][j][k];
  29.  
  30. //当前这一行就放一个炮
  31. //放到没有炮的列
  32. if(j) f[i][j][k] += (m - k - j + 1) * f[i - 1][j - 1][k];
  33. //放到有炮的列
  34. if(k) f[i][j][k] += (j + 1) * f[i - 1][j + 1][k - 1];
  35.  
  36. //当前这一行放两个炮
  37. //放到两个没有炮的列
  38. if(j >= 2) f[i][j][k] += C(m - k - j + 2) * f[i - 1][j - 2][k];
  39. //放到两个有炮的列
  40. if(k >= 2) f[i][j][k] += C(j + 2) * f[i - 1][j + 2][k - 2];
  41. //放到一个有炮的列,一个没有炮的列
  42. if(j && k) f[i][j][k] += j * (m - j - k + 1) * f[i - 1][j][k - 1];
  43.  
  44. f[i][j][k] %= p;
  45. }
  46. for(i = 0; i <= m; i++)
  47. for(j = 0; j <= m - i; j++)
  48. ans = (ans + f[n][i][j]) % p;
  49. printf("%lld\n", ans);
  50. return 0;
  51. }

  

[luoguP2051] [AHOI2009]中国象棋(DP)的更多相关文章

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

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

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

    https://www.luogu.org/problemnew/show/P2051 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一 ...

  3. P2051 [AHOI2009]中国象棋——DP(我是谁,我在哪,为什么)

    象棋,给你棋盘大小,然后放炮(炮的数量不限),不能让炮打到其他的炮,问方案数: 数据n,m<=200; 状态压缩似乎能做,但是我不会: 因为只要状态数,所以不必纠结每种状态的具体情况: 可以想出 ...

  4. Luogu 2051[AHOI2009]中国象棋 - DP

    Description 在 $n * m$ 的格子上放若干个炮, 使得每个炮都不能攻击到其他炮 Solution 定义数组f[ i ][ j ][ k ] 表示到了第 i 行, 已经有2个炮的列数为 ...

  5. 洛谷P2051 [AHOI2009]中国象棋(dp)

    题面 luogu 题解 \(50pts:\)显然是\(3\)进制状压\(dp\) \(100pts:\) 一行一行地考虑 \(f[i][j][k]\)表示前\(i\)行,有\(j\)列放了一个,有\( ...

  6. [AHOI2009]中国象棋 DP,递推,组合数

    DP,递推,组合数 其实相当于就是一个递推推式子,然后要用到一点组合数的知识 一道很妙的题,因为不能互相攻击,所以任意行列不能有超过两个炮 首先令f[i][j][k]代表前i行,有j列为一个炮,有k列 ...

  7. 洛谷.2051.[AHOI2009]中国象棋(DP)

    题目链接 /* 每行每列不能超过2个棋子,求方案数 前面行对后面行的影响只有 放了0个.1个.2个 棋子的列数,与排列方式无关 所以设f[i][j][k]表示前i行,放了0个棋子的有j列,放了1个棋子 ...

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

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

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

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

随机推荐

  1. IOS之TextView属性设置

    UIFontDescriptor *bodyFontDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFont ...

  2. VS远程调试虚拟机中的程序

    1.  设置VS项目属性 => 调试页   例子如下 远程命令: C:\test.exe 工作目录 : C:\ 远程服务器名称:  192.168.xx.xx  查看网络共享 => 本地连 ...

  3. 洛谷 P1181 数列分段Section I(水题日常)

    题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格式: 输入文件divide_ ...

  4. Install your Application into RaspberryPi2 and automatically start up

    如何安装和卸载应用程序到RaspberryPi2? 如何配置应用程序在RaspberryPi2开机后自动启动? How to install your app into RaspberryPi2? H ...

  5. Javascript的一些经验总结

    JavaScript作用域 1.作用域 JavaScript的作用域与C.Java等语言不同,它不是以花括号包围的块级作用域,这个特性经常被大多数人忽视.例如下面代码,在大多数类C的语言中会出现变量未 ...

  6. Java-NestedClass(Interface).

    内部类(Nested Class) 内部类:即在一个类中还包含着另外一个类,一般是作为匿名类或者是使用数据隐藏时使用的.例子: //内部类 class Out{ private int age = 1 ...

  7. Thread源码分析-java8

    1.Thread特性分析 守护线程Daemon 定性:支持性线程,主要用于程序中后台调度以及支持性工作. 当JVM中不存在Daemon线程时,JVM将会退出. 将一个线程设定为Daemon的方法: 调 ...

  8. python简单爬虫爬取百度百科python词条网页

    目标分析:目标:百度百科python词条相关词条网页 - 标题和简介 入口页:https://baike.baidu.com/item/Python/407313 URL格式: - 词条页面URL:/ ...

  9. OpenCascade: 获取边的端点

    FirstV = TopExp::FirstVertex(aEdge1); LastV = TopExp::LastVertex(aEdge1);

  10. go语音实战读后感——一

    1.第一个go程序: package main import ( "fmt" ) func main() { fmt.Println("Hello go") } ...