题意:就是在n*m的格子中放“炮”(中国象棋中的棋子)问有多少种放法,使得没有任意的两个炮相互攻击

思路:我们很容易的得到一列或者一行中最多放下两个炮(我也只能得到这些了,满脑子状压,但数据范围有100),这篇博客些的很好(传送门),我们定义dp[i][j][k]代表前i行我们有j列式有2个棋子,有k列是一个棋子,那么我们空的列的个数为m-i-j,我们在每行填的时候最多填2个,这样保证了我们每行不会多于2个。然后就是分情况讨论了

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
inline LL read()
{LL x=0,f=1;char ch=getchar();while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}const LL MOD=9999973;
LL dp[107][107][107];int main()
{int n=read(),m=read();dp[0][0][0]=1;for(int i=1;i<=n;i++){for(int j=0;j<=m;j++){for(int k=0;k<=m-j;k++){LL res=0;res+=dp[i-1][j][k];if(j)res+=dp[i-1][j-1][k+1]*(k+1);if(k)res+=dp[i-1][j][k-1]*(m-j-k+1);if(j&&k)res+=dp[i-1][j-1][k]*k*(m-j-k+1);if(j>1)res+=dp[i-1][j-2][k+2]*(k+2)*(k+1)/2;if(k>1)res+=dp[i-1][j][k-2]*(m-j-k+2)*(m-j-k+1)/2;dp[i][j][k]=res%MOD;}}}LL ans=0;for(int i=0;i<=m;i++){for(int j=0;j<=m-i;j++){ans=(ans+dp[n][i][j])%MOD;}}printf("%lld\n",ans%MOD);return 0;
}

转载于:https://www.cnblogs.com/lalalatianlalu/p/9791130.html

BZOJ 1801 [Ahoi2009]中国象棋(线性动规)(洛谷P2051)相关推荐

  1. BZOJ 1801 chess 中国象棋

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

  2. 洛谷 P2051 [AHOI2009]中国象棋 状态压缩思想DP

    P2051 [AHOI2009]中国象棋 题意: 给定一个n*m的空棋盘,问合法放置任意多个炮有多少种情况.合法放置的意思是棋子炮不会相互打到. 思路: 这道题我们可以发现因为炮是隔一个棋子可以打出去 ...

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

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

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

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

  5. BTTCOJ 问题 E: 维和部队 线性动规

    题目描述 在2019国庆大阅兵仪式上,蓝色贝雷帽,荒漠迷彩服,维和部队方队阔步走来.中国是联合国安理会常任理事国中派出维和人员最多的国家.在联合国7个维和任务区,2500多名中国军人守护在最危险的地方 ...

  6. AHOI2009 中国象棋

    题目链接 题目描述 在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法. (在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同 ...

  7. LG_2051_[AHOI2009]中国象棋

    题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...

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

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

  9. 【洛谷 P2051】 [AHOI2009]中国象棋(DP)

    题目链接 首先想到状压dp,但是\(n,m\)高达100,怎么压? 容易发现,每行每列最多两个象棋,否则就直接gg了. 一个巧妙的设置状态的方式是,只需要记录到当前行有多少列是放了1个炮和2个炮. 然 ...

最新文章

  1. Oracle不能在本地计算机启动,Windows 不能在本地计算机启动 OracleDBConsoleorcl的问题解决方法...
  2. mysql5.6.37驱动_MySql (mysql-5.6.37) 在Windows的安装及使用
  3. 使用LeNet对于旋转数字进行识别:合并数字集合
  4. Server Application Unavailable
  5. Mybatis中传参包There is no getter for property named XXX in class java.lang.String
  6. 高清、免版权美图资源大全
  7. ac算法 有什么用 Java_AC算法使用例子
  8. Datawhale组队-Pandas(下)文本数据(打卡)
  9. sysadmin默认密码_Sysadmin指南,开源电子邮件客户端,macOS应用程序,SELinux,Firefox扩展等...
  10. Data Pump -- Example
  11. 创新不是突然而至——它是慢慢成长的
  12. 网络中的延迟和抖动问题
  13. 计算机用户名显示TEMP,win10只要打开ie桌面出现temp文件夹如何解决
  14. 联想家悦微型计算机的包装箱,08年联想家悦所有型号,联想家悦小机箱型号-
  15. FlyThings OS:基于Linux实现现代化人机交互体验的新嵌入式操作系统
  16. 华东师范大学计算机模拟试题,华东师范大学计算机机试真题
  17. 赚钱App研究之格式转换类app
  18. Jenkins针对不同的项目视图对不同的用户进行权限分配
  19. Linux Shell相关记笔记
  20. jedis的操作和使用

热门文章

  1. 【C++自我精讲】基础系列二 const
  2. webform里的验证控件
  3. Newtonsoft.Json.dll 本地调用正常,服务器调用不正常
  4. java 数据类型转换的一场_Java基础 — 四类八种基本数据类型
  5. 二部图最大权匹配_12,百度竞价推广账户搭建,关键词匹配-网络运营文字版
  6. java servlet 参数乱码_JSPServlet处理参数中的中文乱码总结
  7. 位运算符Java与详解_java位运算符详解
  8. oracle实例包括用户进程吗,ORACLE实例和ORACLE数据库详解(三)
  9. php打印出来乱码_PHP输出中文乱码的解决方法(转载)
  10. mybatis可以用oracle,使用MyBatis调用oracle函数(基于注释)