【题解】AHOI2009中国象棋
还记得第一次看见这题的时候好像还是联赛前后的事了,那时感觉这题好强……其实现在看来蛮简单的,分类讨论一下即可。题意非常的简单:每一行,每一列都不能超过两个棋子。考虑我们的dp,如果一行一行转移的话行上不能超过两个棋子是很好满足的,就看列上如何满足了。所以状态自然而然的设置为 \(f[i][j][k]\),分别代表枚举到第 \(i\) 行,之前的列上有 \(j\) 列上有两个棋子,\(k\)列上有一个棋子时的方案数。
然后分情况转移乘以组合数即可。虽然简单,但感觉还是有所启发:做组合数类型的DP,应该观察到对后续状态真正产生影响的要素,只需保留这几样作为状态即可,其余的任选都有组合数来体现(其实一般的DP也是这样吧(`・ω・´))代码里面有小小注释……个人喜欢打英文的(主要是懒得切输入法)。
#include <bits/stdc++.h>
using namespace std;
#define maxn 200
#define int long long
#define mod 9999973
int n, m, ans, f[maxn][maxn][maxn];
int C[maxn][]; int read()
{
int x = , k = ;
char c;
c = getchar();
while(c < '' || c > '') { if(c == '-') k = -; c = getchar(); }
while(c >= '' && c <= '') x = x * + c - '', c = getchar();
return x * k;
} void up(int &x, int y) { x = (x + y % mod) % mod; } void init()
{
for(int i = ; i <= m; i ++) C[i][] = ;
for(int i = ; i <= m; i ++)
for(int j = ; j <= ; j ++)
if(j > i) C[i][j] = ;
else C[i][j] = C[i - ][j - ] + C[i - ][j];
} signed main()
{
n = read(), m = read();
f[][][] = ; init();
for(int i = ; i < n; i ++)
for(int j = ; j <= m; j ++)
for(int k = ; k <= m - j; k ++)
{
if(!f[i][j][k]) continue;
up(f[i + ][j][k], f[i][j][k]); //
int t = m - j - k, S = f[i][j][k];
// place a chess
if(t) up(f[i + ][j][k + ], S * t); // placed on a row of 0;
if(k) up(f[i + ][j + ][k - ], S * k); // placed on a row of 1;
// place two chess
if(t >= ) up(f[i + ][j][k + ], S * C[t][]); //two on zero;
if(k && t) up(f[i + ][j + ][k], S * t * k); // one on zero, one on one;
if(k >= ) up(f[i + ][j + ][k - ], S * C[k][]); // two on one;
}
for(int j = ; j <= m; j ++)
for(int k = ; k <= m - j; k ++)
up(ans, f[n][j][k]);
printf("%lld\n", ans);
return ;
}
【题解】AHOI2009中国象棋的更多相关文章
- [洛谷P2051] [AHOI2009]中国象棋
洛谷题目链接:[AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法 ...
- 洛谷 P2051 [AHOI2009]中国象棋 解题报告
P2051 [AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法. ...
- luogu 2051 [AHOI2009]中国象棋
luogu 2051 [AHOI2009]中国象棋 真是一道令人愉♂悦丧心并框的好题... 首先"没有一个炮可以攻击到另一个炮"有个充分条件就是没有三个炮在同一行或同一列.证明:显 ...
- 洛谷 P2051 [AHOI2009]中国象棋 状态压缩思想DP
P2051 [AHOI2009]中国象棋 题意: 给定一个n*m的空棋盘,问合法放置任意多个炮有多少种情况.合法放置的意思是棋子炮不会相互打到. 思路: 这道题我们可以发现因为炮是隔一个棋子可以打出去 ...
- Luogu P2051 [AHOI2009]中国象棋(dp)
P2051 [AHOI2009]中国象棋 题面 题目描述 这次小可可想解决的难题和中国象棋有关,在一个 \(N\) 行 \(M\) 列的棋盘上,让你放若干个炮(可以是 \(0\) 个),使得没有一个炮 ...
- [Luogu P2051] [AHOI2009]中国象棋 (状压DP->网格DP)
题面 传送门:https://www.luogu.org/problemnew/show/P2051 Solution 看到这题,我们不妨先看一下数据范围 30pt:n,m<=6 显然搜索,直接 ...
- BZOJ1801:[AHOI2009]中国象棋——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1801 https://www.luogu.org/problemnew/show/P2051 这次小 ...
- P2051 [AHOI2009]中国象棋
题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...
- [P2051 [AHOI2009]中国象棋] DP
https://www.luogu.org/problemnew/show/P2051 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一 ...
- LG_2051_[AHOI2009]中国象棋
题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...
随机推荐
- loushang框架的开发中关于BSP的使用,将写好的功能模块部署到主页界面结构上
前言: 当我们已经开发好相应的模块或者功能的时候,需要将这个功能部署在index主页上作为可点击直接使用的模块,而不是每次需要去浏览对应的url地址. 这时候就需要运用到L5的BSP. 作为刚刚入门l ...
- PyCharm+QT Designer整合
CMD下使用pip安装PyQt4或者PYQT5 这里要注意,你下载的PYQT5不包含QT designer 还要:pip3 install PyQt5-tools,好像Pyqt5中将designer分 ...
- Python学习:变量
变量(Variables): 是为了存储程序在运算过程中的一些中间结果,为了方便日后调用储存在计算的内存中 官方介绍: Variables are used to storeinformation t ...
- 004---Python基本数据类型--元祖
元祖 .caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px ...
- 2018 ccpc final I. Cockroaches
I. Cockroaches time limit per test6. s memory limit per test256 MB inputstandard input outputstandar ...
- 43-Identity MVC:UI
1-打开之前写的MvcCookieAuthSample项目, 在AccountController新加Register,Login方法 public class AccountController : ...
- ABS(引数と同じ大きさの正の数を返す)
ABS 関数 [数値] 数値式の絶対値を返します. 構文 ABS( numeric-expression ) パラメータ numeric-expression 絶対値が返される数値. 戻り値 数値 ...
- C++11中default的使用
In C++11, defaulted and deleted functions give you explicit control over whether the special member ...
- CC3200作为STA模式连接路由器sl_WlanConnect出现exception occured at:0xa72fcf6
1. 先看下出错的提示 2. 出错的代码部分,现在问题是定位不到哪一行代码出问题,反正运行一段时间就进入了 lRetVal = sl_WlanConnect((signed , &secPar ...
- MyEclipse - 问题集 - 创建Maven项目,JDK版本默认是1.5
修改Maven的配置文件settings.xml,增加profile节点,如下所示: <profile> <id>jdk-1.8</id> <activati ...