题目链接:BZOJ - 1801

题目分析

对于50%的数据是可以直接状压 DP 的。

对于100%的数据,使用递推的 DP 。(或者这只叫递推不叫 DP ?)

可以发现,每一行和每一列的棋子个数不能超过 2 个。

用 f[i][j][k] 表示前 i 行,有 j 列有 1 个棋子,有 k 列有 2 个棋子的方案数。(有 0 个棋子的列数可以用 m - j - k 得到。)

初始状态 f[0][0][0] = 1;

转移时从第 i - 1 行转移过来,由于一行最多放 2 个棋子,所以可以讨论各种情况,转移一下。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std; const int MaxN = 100 + 5; typedef long long LL; const LL Mod = 9999973; int n, m; LL Ans;
LL f[MaxN][MaxN][MaxN]; LL C2(int a) {
LL ret;
ret = (LL)a * (LL)(a - 1) / 2ll % Mod;
return ret;
} int main()
{
scanf("%d%d", &n, &m);
f[0][0][0] = 1;
Ans = 0ll;
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= m; ++j) {
for (int k = 0; k <= m - j; ++k) {
f[i][j][k] = f[i - 1][j][k];
if (j >= 1) f[i][j][k] = (f[i][j][k] + (f[i - 1][j - 1][k] * (LL)(m - (j - 1) - k) % Mod)) % Mod;
if (k >= 1) f[i][j][k] = (f[i][j][k] + (f[i - 1][j + 1][k - 1] * (LL)(j + 1) % Mod)) % Mod;
if (j >= 2) f[i][j][k] = (f[i][j][k] + (f[i - 1][j - 2][k] * C2(m - (j - 2) - k) % Mod)) % Mod;
if (k >= 2) f[i][j][k] = (f[i][j][k] + (f[i - 1][j + 2][k - 2] * C2(j + 2) % Mod)) % Mod;
if (j >= 1 && k >= 1) f[i][j][k] = (f[i][j][k] + (f[i - 1][j][k - 1]) * (LL)(j) * (LL)(m - j - (k - 1)) % Mod) % Mod;
if (i == n) Ans = (Ans + f[i][j][k]) % Mod;
}
}
}
printf("%lld\n", Ans);
return 0;
}

  

[BZOJ 1801] [Ahoi2009]chess 中国象棋 【DP】的更多相关文章

  1. BZOJ 1801: [Ahoi2009]chess 中国象棋( dp )

    dp(i, j, k)表示考虑了前i行, 放了0个炮的有j列, 放了1个炮的有k列. 时间复杂度O(NM^2) -------------------------------------------- ...

  2. BZOJ 1801: [Ahoi2009]chess 中国象棋 [DP 组合计数]

    http://www.lydsy.com/JudgeOnline/problem.php?id=1801 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放 ...

  3. bzoj 1801: [Ahoi2009]chess 中国象棋【dp】

    注意到一行只能放012个炮,我们只需要知道列的状态,不用状压行 所以设f[i][j][k]表示前i行有j列有1个炮,有k列有2个炮的方案数 然后分情况讨论转移就行了 #include<cstdi ...

  4. bzoj 1801: [Ahoi2009]chess 中国象棋

    Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N, ...

  5. Bzoj 1081 [Ahoi2009] chess 中国象棋

    bzoj 1081 [Ahoi2009] chess 中国象棋 题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1801 状态比较难设,的确 ...

  6. 【BZOJ1801】[Ahoi2009]chess 中国象棋 DP

    [BZOJ1801][Ahoi2009]chess 中国象棋 Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮 ...

  7. 【BZOJ】1801 [Ahoi2009]chess 中国象棋(dp)

    题目 传送门:QWQ 分析 发现我们关心的不是棋子的位置,我们只关心棋子数量就ok. 首先每行每列最多两个棋子.这是显然的. 然后我觉得本题最难的部分就是对行进行讨论,蒟蒻我一直被限制在了对格点讨论. ...

  8. BZOJ——T 1801: [Ahoi2009]chess 中国象棋

    http://www.lydsy.com/JudgeOnline/problem.php?id=1801 Time Limit: 10 Sec  Memory Limit: 64 MBSubmit:  ...

  9. bzoj1801: [Ahoi2009]chess 中国象棋 dp

    题意:在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. 题解:dp[i][j][k]表示到了第i行,有j列 ...

随机推荐

  1. hdu1043Eight (经典的八数码)(康托展开+BFS)

    建议先学会用康托展开:http://blog.csdn.net/u010372095/article/details/9904497 Problem Description The 15-puzzle ...

  2. oracle中 sql%rowcount 使用方法

    sql%rowcount用于记录改动的条数,必须放在一个更新或者删除等改动类语句后面运行,select语句用于查询的话无法使用, 当你运行多条改动语句时,依照sql%rowcount 之前运行的最后一 ...

  3. docker registry 搭建

    registry 搭建 假设在 cd /root 目录下 最新 docker run -d -p 5000:5000 -v pwd/data:/var/lib/registry --restart=a ...

  4. Qt 学习之路:Canvas

    在 QML 刚刚被引入到 Qt 4 的那段时间,人们往往在讨论 Qt Quick 是不是需要一个椭圆组件.由此,人们又联想到,是不是还需要其它的形状?这种没玩没了的联想导致了一个最直接的结果:除了圆角 ...

  5. 搬移到GitHub Page啦~

    GitHub: https://github.com/BOT-Man-JL/ Page: https://BOT-Man-JL.github.io/

  6. git subproject commit xxxxxxxxxxxxxxxxxxxxx -dirty

    -Subproject commit 8c75e65b647238febd0257658b150f717a136359 +Subproject commit 8c75e65b647238febd025 ...

  7. 利用jpedal进行pdf转换成jpeg,jpg,png,tiff,tif等格式的图片

    项目中运用到pdf文件转换成image图片,开始时使用pdfbox开源库进行图片转换,但是转换出来的文件中含有部分乱码的情况.下面是pdfBox 的pdf转换图片的代码示例. try{ String ...

  8. win 10 安装 mysql解压版 步骤

    参考资料:win 10 安装 mysql 5.7 网址:http://blog.sina.com.cn/s/blog_5f39af320102wbk0.html 本文参考上面的网址的教程,感谢作者分享 ...

  9. Java_Activiti5_菜鸟也来学Activiti5工作流_之初识BPMN2.0的简单结构(五)

    <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http:// ...

  10. 安装SQL Server2008时 检测时有“重启计算机”失败

    第一种解决方案: 在学校的时候 遇到这种问题的解决办法是: 卸载VS,先安装SQL Server 2008 再安装VS 就行了: 第二种解决方案: 如果已经安装过VS,在安装SQL Server200 ...