题解:

首先知道一个性质,每一行每一列都最多有两个炮

那么很显然是DP

设F[i][j][k]表示前i行,有j列有一个炮,有k列有两个炮,那么转移式子为

这一行什么都不做:f[i][j][k]=f[i-1][j][k]
这一行填一个炮在列为0:f[i][j][k]=f[i-1][j-1][k]*c(m-j-k+1,1)
这一行填一个炮在列为1:f[i][j][k]=f[i-1][j+1][k-1]*c(j+1,1)
这一行填两个炮在列为0:f[i][j][k]=f[i-1][j-2][k]*c(m-j-k+2,2)
这一行填一个炮在列为0一个炮在列为1:f[i][j][k]=f[i-1][j][k-1]*c(j,1)*c(m-j-k+1,1)
这一行填两个炮在列为1:f[i][j][k]=f[i-1][j+2][k-2]*c(j+2,2)

代码:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#define mod 9999973
#define ll long long
using namespace std;
int n,m,ans;
int f[101][101][101],c[101][101];
int main()
{scanf("%d%d",&n,&m);for(int i=0;i<=100;i++)c[i][0]=1;for(int i=1;i<=100;i++)for(int j=1;j<=i;j++)c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;f[0][0][0]=1;for(int i=1;i<=n;i++)for(int j=0;j<=m;j++)for(int k=0;j+k<=m;k++){f[i][j][k]=f[i-1][j][k];if(j>=1)f[i][j][k]=(f[i][j][k]+(ll)f[i-1][j-1][k]*c[m-j-k+1][1]%mod)%mod;if(k>=1 && j+1<=m)f[i][j][k]=(f[i][j][k]+(ll)f[i-1][j+1][k-1]*c[j+1][1]%mod)%mod;if(j>=2)f[i][j][k]=(f[i][j][k]+(ll)f[i-1][j-2][k]*c[m-j-k+2][2]%mod)%mod;if(j>=1 && k>=1)f[i][j][k]=(f[i][j][k]+(ll)f[i-1][j][k-1]*c[j][1]%mod*c[m-j-k+1][1]%mod)%mod;if(k>=2 && j+2<=m)f[i][j][k]=(f[i][j][k]+(ll)f[i-1][j+2][k-2]*c[j+2][2])%mod;}for(int i=0;i<=m;i++)for(int j=0;j<=m;j++)ans=(ans+f[n][i][j])%mod;return !printf("%d\n",ans);
}

转载于:https://www.cnblogs.com/worcher/p/11564532.html

【BZOJ1801】【DTOJ2004】 [Ahoi2009]chess 中国象棋 【DP】相关推荐

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

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

  2. BZOJ1801: [Ahoi2009]chess 中国象棋

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

  3. bzoj 1801: [Ahoi2009]chess 中国象棋 bzoj 4806: 炮

    1801: [Ahoi2009]chess 中国象棋 Time Limit: 10 Sec  Memory Limit: 64 MB Submit: 1851  Solved: 1062 [Submi ...

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

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

  5. JZOJ 1667【AHOI2009】中国象棋——dp

    题目:https://jzoj.net/senior/#main/show/1667 只注重0.1.2的列有多少个,不注重它们的位置,就能记录了. #include<iostream> # ...

  6. BZOJ 1801 AHOI 2009 chess 中国象棋 DP

    题目大意:给出棋盘的大小,问任意行和列放置的棋子都不超过两个有多少种方案. 思路:一个比较麻烦的DP.f[i][j][k]表示到前i行,放置了一个棋子的列为j,放置了两个棋子的列为k的方案数,然后有六 ...

  7. BZOJ 1801 chess 中国象棋

    题意: 在n * m 的棋盘上放"炮",使得任意两个炮都不会互相攻击,求方案数. 题解: 既然是求方案数,那么考虑数学方法和递推,这一道题的限制条件比较麻烦,数学方法不合适,考虑递 ...

  8. 2017.10.23 chess 中国象棋 思考记录

    这种题的一般解法: 1. 发现状压可以搞,然后发现状态爆炸 2.考虑状态特点,一共只有几种可能的状态 3.考虑可不可以只对状态进行计数 4.离散统计贡献 码: #include<iostream ...

  9. [AHOI 2009]chess 中国象棋

    Description 题库链接 给你一张 \(N\times M\) 的棋盘.要求每行每列最多放两个棋子,问总方案数. \(1\leq N,M\leq 100\) Solution 记 \(f_{i ...

最新文章

  1. 编程之美-求数组的子数组之和的最大值方法整理
  2. python3.x : 安装opencv
  3. ImageNet标签竟然部分有误!数据集MNIST也会出错?
  4. 最小生成树唯一吗_最小生成树 - 齐芒
  5. AJAX POST跨域 解决方案 - CORS(转载)
  6. 散列:散列函数与散列表(hash table)
  7. 程序员到项目经理:从内而外的提升(比较全面的介绍)
  8. Redis实现分布式session功能的共享
  9. c语言大作业图书馆,大一C语言课程设计—图书馆管理系统
  10. 推理证明技巧之人肉计算机,四大推理方法搞定高中证明题
  11. Vite入门从手写一个乞丐版的Vite开始(下)
  12. HBuilderX快速上手
  13. 气象环境监测系统有哪些组成设备
  14. idea怎么设置热启动
  15. 计算机表格大小怎么调整,excel把表格拉大_excel调整单元格大小的方法步骤详解...
  16. AI出奇迹!人工智能创造出世界首项体育运动,还充满享受、包容精神
  17. 为什么手机一开机,就有Powered by Android
  18. 【捌】小白必备的房·地·产投·资神器——REITs
  19. java继承和多态_Java基础继承与多态
  20. EDK2驱动框架之—Protocol

热门文章

  1. SpringCloud采坑之Feign服务间调用默认返回xml
  2. Asp.net core使用IIS在windows上进行托管
  3. ansible-playbook如何判断并中断执行
  4. Python网络数据采集
  5. [转载] 中华典故故事(孙刚)——13 马虎
  6. Windows 2003 主域控和DNS迁移到Windows 2008 R2(2)
  7. mysql数据源找不到_mysql报出找不到目标数据源为啥? 同一个方法在其他地方调用正常...
  8. 【正一专栏】瓜迪奥拉就是一座无可匹及的丰碑
  9. 说说牛顿迭代 -- 方法篇
  10. vue中比较完美请求的栗子(使用 axios 访问 API)