题目链接: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. eclipse有时新建一个PHP文件或者是HTML文件没有快捷键太麻烦了,总要用鼠标点 怎么创建自己的快捷键呢?

    问题:总是在eclipse上编写PHp程序和对应的HMTL模板文件,但是却没有可以直接新PHP文件和HTMl文件的快捷方式,苦恼. 在百度上搜了一下,我们是可以创建自己的组合快捷键的. 创建快捷键的方 ...

  2. java.lang.RuntimeException: Missing type parameter

    程序中用到了gson的new typeToken,结果打包成apk发布时,发现抛出异常,但不通过打包apk时发现一切正常,百思不得其解,最初怀疑没有将gson-1.7.1.JAR打包进去,后来经过测试 ...

  3. Android Layout布局文件里的android:layout_height等属性不起作用

    有的时候,我们配置好的布局文件,在加载完成添加到我们的Activity中后发现,并没有安装我们设置的属性 来布局,比为我们设置了android:layout_marginTop="100di ...

  4. iOS开发-No matching provisioning profiles found解决方法

    今天真机调试的时候莫名其妙遇到了这种一个问题: This product type must be built using a provisioning profile, however no pro ...

  5. BloomFilter--大规模数据处理利器

    Bloom Filter是由Bloom在1970年提出的一种多哈希函数映射的快速查找算法.通常应用在一些需要快速判断某个元素是否属于集合,但是并不严格要求100%正确的场合. 一. 实例 为了说明Bl ...

  6. malloc函数具体解释

    一.原型:extern void *malloc(unsigned int num_bytes); 头文件:#include <malloc.h> 或 #include <alloc ...

  7. linux诡异的半连接(SYN_RECV)队列长度

    linux诡异的半连接(SYN_RECV)队列长度(一) >>转载请注明来源:飘零的代码 piao2010 ’s blog,谢谢!^_^>>本文链接地址:linux诡异的半连接 ...

  8. LINUX内核调度器+linux 内存

    http://www.cnblogs.com/tolimit/p/4303052.html

  9. 在进行页面的DIV CSS排版时,遇到IE6(当然有时Firefox下也会偶遇)浏览器中的图片元素img下出现多余空白的问题绝对是常见的对于该问题的解决方法也是“见机行事”。

    当一个img标签没得图片时,在firox中,即使给img标签设置了固定高度和宽度,img标签还是不会站位: 解决方法一:直接将img设置为块状元素:即,设置img为“display:block;”.在 ...

  10. Oracle数据库管理员经常使用的表和视图

    ◆dba_开头 dba_users 数据库用户信息 dba_segments 表段信息 dba_extents 数据区信息 dba_objects 数据库对象信息 dba_tablespaces 数据 ...