【简●解】[AHOI2009]中国象棋
2024-08-30 14:08:22
【题目大意】
叫你在\(n×m\)的棋盘上放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,问有多少种放置方法。
【关键词】
- \(DP\)
- 分类讨论
- 乘法和加法原理
【分析】
仔细观察就会发现,棋盘中每行,每列只有放\(0\),\(1\),\(2\)个三种方案。如果我们把状态量设为列,那么知道任意两种方案的列数,即可用总列数减去它得到另一种方案的列数。
我们设状态方程:\(f[i][j][k]\),表示的是前\(i\)行,其中\(j\)列有\(1\)个棋子,\(k\)列有\(2\)个棋子的总方案数。
那么对于行的转移,我们有三种情况。
- 在第\(i\)行不放棋子。
- 在第\(i\)行放\(1\)个棋子。
- 在第\(i\)行放\(2\)个棋子。
不放棋子,即\(f[i][j][k]=f[i-1][j][k]\)。
放\(1\)个棋子,又分两种情况:
- 放在有\(1\)个棋子的列上,\(j+1\)列都可以放。即\(f[i][j][k]+=f[i-1][j+1][k-1]*(j+1)\)。
- 放在没有棋子的列上,\(m-(j-1)-k\)列都可放。即\(f[i][j][k]+=f[i-1][j-1][k]*(m-j-k+1)\)
放\(2\)个棋子,分三种情况:
- \(2\)个都放在没有棋子的列上。即\(f[i][j][k]+=f[i-1][j-2][k]*C_{m-(j-2)-k}^{2}\)。
- \(2\)个都放在有\(1\)个棋子的列上。即\(f[i][j][k]+=f[i-1][j+2][k-2]*C_{j+2}^2\)。
- \(1\)个放在没有棋子的列上,另一个放在有\(1\)个棋子的列上。即\(f[i][j][k]+=f[i-1][j][k-1]*(m-j-k+1)\)。
然后就可以\(A\)掉了,哦,记得开\(long long\)。。。
【Code】
#pragma GCC optimize("O3")
#pragma GCC optimize("O2")
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define ll long long
#define R register
using namespace std;
const int MAX = 100 + 5;
const int mod = 9999973;
inline int read(){
int f = 1, x = 0;char ch;
do { ch = getchar(); if (ch == '-') f = -1; } while (ch < '0'||ch>'9');
do {x = x*10+ch-'0'; ch = getchar(); } while (ch >= '0' && ch <= '9');
return f*x;
}
inline ll c(ll x) {
return (x * (x - 1) / 2) % mod;
}
int n, m;
ll f[MAX][MAX][MAX], ans;
int main(){
n = read(), m = read();
f[0][0][0] = 1;
for (R int i = 1;i <= n; ++i) {
for (R int j = 0;j <= m; ++j) {
for (R int k = 0;k <= m - j; ++k) {
f[i][j][k] = f[i-1][j][k];
if (k > 0) {
f[i][j][k] += (f[i-1][j+1][k-1] * (j+1)) % mod;
f[i][j][k] %= mod;
f[i][j][k] += (f[i-1][j][k-1] * j * (m-j-k+1)) %mod;
f[i][j][k] %= mod;
}
if (j > 0) {
f[i][j][k] += (f[i-1][j-1][k] * (m-j-k+1)) %mod;
f[i][j][k] %= mod;
}
if (k > 1) {
f[i][j][k] += (f[i-1][j+2][k-2] * c(j+2)) % mod;
f[i][j][k] %= mod;
}
if (j > 1) {
f[i][j][k] += (f[i-1][j-2][k] * c(m-j-k+2)) % mod;
f[i][j][k] %= mod;
}
}
}
}
for (R int i = 0;i <= m; ++i) {
for (R int j = 0;j <= m; ++j) {
ans += f[n][i][j];
ans %= mod;
}
}
printf("%lld", (ans + mod) % mod);
return 0;
}
最新文章
- Python2.7-异常和工具
- Jackson 高性能的JSON处理 ObjectMapper
- Java、JSP获得当前日期的年、月、日
- iOS 8创建交互式通知
- es6 箭头函数(arrow function) 学习笔记
- Spring第五篇【cglib、手动实现AOP编程】
- javascript语言扩展:可迭代对象(3)
- .net自定义错误页面实现
- 2019秋招Java面经(未完待续)
- 相约南湖,南京都昌信息亮相南湖HIT论坛
- Linux-VMware Workstation&;CentOS-5.5-i386-bin-DVD安装
- centos7 关闭selinux
- HDU 5950 Recursive sequence(矩阵快速幂)
- 通过DataTrigger绑定Tag属性值进行判断(.net 3.5的环境)
- HTML5 3D爱心动画及其制作过程
- Task 6.2冲刺会议六 /2015-5-19
- C++解析命令行参数(仿C语言args)
- Hive中如何添加自定义UDF函数以及oozie中使用hive的自定义函数
- 打开 EXCEL时出现RUN-TIME ERROR“91”,怎么解决?
- Centos7环境下 安装ffmage2.7.1过程
热门文章
- 用sublime text3 直接编译C/C++,java
- redis优势
- AtCoder Regular Contest 062 E - AtCoDeerくんと立方体づくり / Building Cubes with AtCoDeer
- Query on a tree IV SPOJ - QTREE4
- JavaScript入门2
- [已读]编写可维护的javascript
- (转 )Unity对Lua的编辑器拓展
- 后TOS时代的码头数字化生产力
- 详解 Handler 消息处理机制(附自整理超全 Q&;A)
- grep的几个参数