[luoguP2051] [AHOI2009]中国象棋(DP)
注释写明了一切
- #include <cstdio>
- #define N 111
- #define p 9999973
- #define LL long long
- int n, m;
- LL ans, f[N][N][N];
- //每一行和每一列可以放0/1/2个炮
- //f[i][j][k]表示前i行放了1个炮的列有j个,放了2个炮的列有k个的方案数
- //那么可以推出,放了0个炮的列有m-j-k个
- inline int C(int x)
- {
- return x * (x - 1) / 2;
- }
- int main()
- {
- int i, j, k, l;
- scanf("%d %d", &n, &m);
- f[0][0][0] = 1;
- for(i = 1; i <= n; i++)
- for(j = 0; j <= m; j++)
- for(k = 0; k <= m - j; k++)
- {
- //当前这一行不放炮
- f[i][j][k] += f[i - 1][j][k];
- //当前这一行就放一个炮
- //放到没有炮的列
- if(j) f[i][j][k] += (m - k - j + 1) * f[i - 1][j - 1][k];
- //放到有炮的列
- if(k) f[i][j][k] += (j + 1) * f[i - 1][j + 1][k - 1];
- //当前这一行放两个炮
- //放到两个没有炮的列
- if(j >= 2) f[i][j][k] += C(m - k - j + 2) * f[i - 1][j - 2][k];
- //放到两个有炮的列
- if(k >= 2) f[i][j][k] += C(j + 2) * f[i - 1][j + 2][k - 2];
- //放到一个有炮的列,一个没有炮的列
- if(j && k) f[i][j][k] += j * (m - j - k + 1) * f[i - 1][j][k - 1];
- f[i][j][k] %= p;
- }
- for(i = 0; i <= m; i++)
- for(j = 0; j <= m - i; j++)
- ans = (ans + f[n][i][j]) % p;
- printf("%lld\n", ans);
- return 0;
- }
[luoguP2051] [AHOI2009]中国象棋(DP)的更多相关文章
- Luogu P2051 [AHOI2009]中国象棋(dp)
P2051 [AHOI2009]中国象棋 题面 题目描述 这次小可可想解决的难题和中国象棋有关,在一个 \(N\) 行 \(M\) 列的棋盘上,让你放若干个炮(可以是 \(0\) 个),使得没有一个炮 ...
- [P2051 [AHOI2009]中国象棋] DP
https://www.luogu.org/problemnew/show/P2051 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一 ...
- P2051 [AHOI2009]中国象棋——DP(我是谁,我在哪,为什么)
象棋,给你棋盘大小,然后放炮(炮的数量不限),不能让炮打到其他的炮,问方案数: 数据n,m<=200; 状态压缩似乎能做,但是我不会: 因为只要状态数,所以不必纠结每种状态的具体情况: 可以想出 ...
- Luogu 2051[AHOI2009]中国象棋 - DP
Description 在 $n * m$ 的格子上放若干个炮, 使得每个炮都不能攻击到其他炮 Solution 定义数组f[ i ][ j ][ k ] 表示到了第 i 行, 已经有2个炮的列数为 ...
- 洛谷P2051 [AHOI2009]中国象棋(dp)
题面 luogu 题解 \(50pts:\)显然是\(3\)进制状压\(dp\) \(100pts:\) 一行一行地考虑 \(f[i][j][k]\)表示前\(i\)行,有\(j\)列放了一个,有\( ...
- [AHOI2009]中国象棋 DP,递推,组合数
DP,递推,组合数 其实相当于就是一个递推推式子,然后要用到一点组合数的知识 一道很妙的题,因为不能互相攻击,所以任意行列不能有超过两个炮 首先令f[i][j][k]代表前i行,有j列为一个炮,有k列 ...
- 洛谷.2051.[AHOI2009]中国象棋(DP)
题目链接 /* 每行每列不能超过2个棋子,求方案数 前面行对后面行的影响只有 放了0个.1个.2个 棋子的列数,与排列方式无关 所以设f[i][j][k]表示前i行,放了0个棋子的有j列,放了1个棋子 ...
- 洛谷 P2051 [AHOI2009]中国象棋 状态压缩思想DP
P2051 [AHOI2009]中国象棋 题意: 给定一个n*m的空棋盘,问合法放置任意多个炮有多少种情况.合法放置的意思是棋子炮不会相互打到. 思路: 这道题我们可以发现因为炮是隔一个棋子可以打出去 ...
- [Luogu P2051] [AHOI2009]中国象棋 (状压DP->网格DP)
题面 传送门:https://www.luogu.org/problemnew/show/P2051 Solution 看到这题,我们不妨先看一下数据范围 30pt:n,m<=6 显然搜索,直接 ...
随机推荐
- IOS之TextView属性设置
UIFontDescriptor *bodyFontDescriptor = [UIFontDescriptor preferredFontDescriptorWithTextStyle:UIFont ...
- VS远程调试虚拟机中的程序
1. 设置VS项目属性 => 调试页 例子如下 远程命令: C:\test.exe 工作目录 : C:\ 远程服务器名称: 192.168.xx.xx 查看网络共享 => 本地连 ...
- 洛谷 P1181 数列分段Section I(水题日常)
题目描述 对于给定的一个长度为N的正整数数列A[i],现要将其分成连续的若干段,并且每段和不超过M(可以等于M),问最少能将其分成多少段使得满足要求. 输入输出格式 输入格式: 输入文件divide_ ...
- Install your Application into RaspberryPi2 and automatically start up
如何安装和卸载应用程序到RaspberryPi2? 如何配置应用程序在RaspberryPi2开机后自动启动? How to install your app into RaspberryPi2? H ...
- Javascript的一些经验总结
JavaScript作用域 1.作用域 JavaScript的作用域与C.Java等语言不同,它不是以花括号包围的块级作用域,这个特性经常被大多数人忽视.例如下面代码,在大多数类C的语言中会出现变量未 ...
- Java-NestedClass(Interface).
内部类(Nested Class) 内部类:即在一个类中还包含着另外一个类,一般是作为匿名类或者是使用数据隐藏时使用的.例子: //内部类 class Out{ private int age = 1 ...
- Thread源码分析-java8
1.Thread特性分析 守护线程Daemon 定性:支持性线程,主要用于程序中后台调度以及支持性工作. 当JVM中不存在Daemon线程时,JVM将会退出. 将一个线程设定为Daemon的方法: 调 ...
- python简单爬虫爬取百度百科python词条网页
目标分析:目标:百度百科python词条相关词条网页 - 标题和简介 入口页:https://baike.baidu.com/item/Python/407313 URL格式: - 词条页面URL:/ ...
- OpenCascade: 获取边的端点
FirstV = TopExp::FirstVertex(aEdge1); LastV = TopExp::LastVertex(aEdge1);
- go语音实战读后感——一
1.第一个go程序: package main import ( "fmt" ) func main() { fmt.Println("Hello go") } ...