P2051 [AHOI2009]中国象棋(动态规划)
思路
好像是一道挺水的计数的,不知道为什么会是紫题
显然每行和每列最多放两个
首先考虑状压,然后发现三进制状压可做,但是三进制太麻烦了,可以拆成两个二进制,一个表示该列是否是放了一个的,一个表示该列是否是放了两个的
可以发现并不需要知道具体每列放了什么,只需要知道有几个即可,所以把有几列放了一个和有几列放了两个表示进状态中,滚动数组优化一下空间即可
状态转移在代码中
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MOD = 9999973;
int m,n,cur;
int dp[2][110][110];
int C(int n){
return (1LL*n*(n-1)/2)%MOD;
}
int main(){
scanf("%d %d",&n,&m);
dp[cur][0][0]=1;
for(int i=0;i<=n-1;i++,cur^=1){
memset(dp[cur^1],0,sizeof(dp[cur^1]));
for(int j=0;j<=m;j++)
for(int k=0;k<=m-j;k++){
dp[cur^1][j][k]=(dp[cur][j][k]+dp[cur^1][j][k])%MOD;//不放
if(j+k+1<=m)
dp[cur^1][j+1][k]=(dp[cur^1][j+1][k]%MOD+1LL*dp[cur][j][k]*(m-k-j)%MOD)%MOD;//放一个在没有的列上
if(j>=1)
dp[cur^1][j-1][k+1]=(dp[cur^1][j-1][k+1]%MOD+1LL*dp[cur][j][k]*j%MOD)%MOD;//放一个在有一个的列上
if(j+2+k<=m)
dp[cur^1][j+2][k]=(dp[cur^1][j+2][k]%MOD+1LL*dp[cur][j][k]*C(m-j-k)%MOD)%MOD;//放两个在没有的列上
if(j>=2)
dp[cur^1][j-2][k+2]=(dp[cur^1][j-2][k+2]%MOD+1LL*dp[cur][j][k]*C(j)%MOD)%MOD;//放两个在有一个的列上
if(j+k+1<=m&&j>=1)
dp[cur^1][j][k+1]=(dp[cur^1][j][k+1]%MOD+1LL*dp[cur][j][k]%MOD*(m-j-k)%MOD*j%MOD)%MOD;//放一个在没有的列上,一个在有的列上
}
}
int ans=0;
for(int j=0;j<=m;j++)
for(int k=0;k<=m-j;k++){
ans=(ans+dp[cur][j][k])%MOD;
}
printf("%d\n",ans);
return 0;
}
P2051 [AHOI2009]中国象棋(动态规划)的更多相关文章
- 洛谷 P2051 [AHOI2009]中国象棋 解题报告
P2051 [AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法. ...
- 洛谷 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 显然搜索,直接 ...
- [洛谷P2051] [AHOI2009]中国象棋
洛谷题目链接:[AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法 ...
- P2051 [AHOI2009]中国象棋
题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...
- [P2051 [AHOI2009]中国象棋] DP
https://www.luogu.org/problemnew/show/P2051 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一 ...
- 洛谷 P2051 [AHOI2009]中国象棋
题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...
- P2051 [AHOI2009]中国象棋——DP(我是谁,我在哪,为什么)
象棋,给你棋盘大小,然后放炮(炮的数量不限),不能让炮打到其他的炮,问方案数: 数据n,m<=200; 状态压缩似乎能做,但是我不会: 因为只要状态数,所以不必纠结每种状态的具体情况: 可以想出 ...
随机推荐
- POI以SAX方式解析Excel2007大文件(包含空单元格的处理) Java生成CSV文件实例详解
http://blog.csdn.net/l081307114/article/details/46009015 http://www.cnblogs.com/dreammyle/p/5458280. ...
- CSS选择符-----属性选择符
Element[att] 选择具有att属性的E元素 <!DOCTYPE html> <html> <head> <meta charset=" ...
- 在Hue中提交oozie定时任务
可以参见下面这篇博文: 通过hue提交oozie定时任务
- UART接口与COM口的区别
原文地址:https://blog.csdn.net/wordwarwordwar/article/details/78883732 简单的讲:(UART与COM) 嵌入式里面说的串口,一般是指UAR ...
- PLSQL 问题小记
问题1:在一个拼写长字符串的函数中,若出现ora-06502或者ora-06512的错误,则有可能是在拼串的过程中,数据类型的隐式转换出了问题,如:字符类型转为数字,此时会出现错误. 解决方案:在拼串 ...
- .NET 常用ORM之Nbear
NBear是一个基于.Net 2.0.C#2.0开放全部源代码的的软件开发框架类库.NBear的设计目标是尽最大努力减少开发人员的工作量,最大程度提升开发效率,同时兼顾性能及可伸缩性. 一.新建项目并 ...
- APIClound 弹出层 Frame
JS api.openFrame({ name: 'showPic', url: './showPic.html', rect: { // x: api.pageParam.marginBottom, ...
- kali linux中文输入法
kali linux中文输入法 已经使用kali linux有一段时间来,越用越喜欢,真的奥! 最近又有宝宝问我kali linux的中文输入法,鉴于当初在坑里蹲了很长时间,还是记录一下吧! The ...
- MyEclipse非正常关闭问题
问题:电脑突然断电,myeclipse非正常关闭,“Package Explorer”非正常显示,出现错误“Could not create the view: An unexpected excep ...
- 关于Eclipse新建Dynamic Web Projecj默认未创建web.xml的问题
当使用eclipse新建Dynamic Web Projecj时,由于J2EE技术规范的更新,当使用Dynamic web module version默认版本为3.0时,将默认不会创建web.xml ...