BZOJ1801 [Ahoi2009]chess 中国象棋 动态规划
欢迎访问~原文出处——博客园-zhouzhendong
去博客园看该题解
题目传送门 - BZOJ1801
题意概括
在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮。 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧.
n,m<=100
题解
其实就是不出现3炮共线就可以了。
用dp[i][j][k]表示前i行,有j列还可以放1个跑,有k列还可以放2个跑的方案总数。
然后对于每一行,分别按照放0、1、2个炮进行转移。
放0个跑,那么就是:
dp[i+1][j][k]=(dp[i+1][j][k]+dp[i][j][k])%mod;
放1个,可以放在还可以放1个炮的列中,也可以放在还可以放2个炮的列中:
if (j>=1) dp[i+1][j-1][k]=(dp[i+1][j-1][k]+dp[i][j][k]*j)%mod;
if (k>=1) dp[i+1][j+1][k-1]=(dp[i+1][j+1][k-1]+dp[i][j][k]*k)%mod;
放2个,可以都放在还可以放1个炮的列中,也可以都放在还可以放2个炮的列中,也可以每边放一个:
if (j>=2) dp[i+1][j-2][k]=(dp[i+1][j-2][k]+dp[i][j][k]*(j*(j-1)/2))%mod;
if (k>=2) dp[i+1][j+2][k-2]=(dp[i+1][j+2][k-2]+dp[i][j][k]*(k*(k-1)/2))%mod;
if (j>=1&&k>=1)dp[i+1][j][k-1]=(dp[i+1][j][k-1]+dp[i][j][k]*j*k)%mod;
代码
#include <cstring>
#include <algorithm>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
typedef long long LL;
const int N=100+5;
const LL mod=9999973;
int n,m;
LL dp[N][N][N];
int main(){
scanf("%d%d",&n,&m);
memset(dp,0,sizeof dp);
dp[0][0][m]=1;
for (int i=0;i<n;i++)
for (int j=0;j<=m;j++)
for (int k=0;k+j<=m;k++){
if (!dp[i][j][k])
continue;
dp[i+1][j][k]=(dp[i+1][j][k]+dp[i][j][k])%mod;
if (j>=1)
dp[i+1][j-1][k]=(dp[i+1][j-1][k]+dp[i][j][k]*j)%mod;
if (k>=1)
dp[i+1][j+1][k-1]=(dp[i+1][j+1][k-1]+dp[i][j][k]*k)%mod;
if (j>=2)
dp[i+1][j-2][k]=(dp[i+1][j-2][k]+dp[i][j][k]*(j*(j-1)/2))%mod;
if (k>=2)
dp[i+1][j+2][k-2]=(dp[i+1][j+2][k-2]+dp[i][j][k]*(k*(k-1)/2))%mod;
if (j>=1&&k>=1)
dp[i+1][j][k-1]=(dp[i+1][j][k-1]+dp[i][j][k]*j*k)%mod;
}
LL ans=0;
for (int i=0;i<=m;i++)
for (int j=0;j<=m;j++)
ans=(ans+dp[n][i][j])%mod;
printf("%lld",ans);
return 0;
}
BZOJ1801 [Ahoi2009]chess 中国象棋 动态规划的更多相关文章
- BZOJ1801 Ahoi2009 chess 中国象棋 【DP+组合计数】*
BZOJ1801 Ahoi2009 chess 中国象棋 Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行 ...
- BZOJ1801 [Ahoi2009]chess 中国象棋(DP, 计数)
题目链接 [Ahoi2009]chess 中国象棋 设$f[i][j][k]$为前i行,$j$列放了1个棋子,$k$列放了2个棋子的方案数 分6种情况讨论,依次状态转移. #include <b ...
- bzoj1801: [Ahoi2009]chess 中国象棋(DP)
1801: [Ahoi2009]chess 中国象棋 题目:传送门 题解: 表示自己的DP菜的抠脚 %题解... 定义f[i][j][k]表示前i行 仅有一个棋子的有j列 有两个棋子的有k个 的方案数 ...
- [luogu2051][bzoj1801][AHOI2009]chess中国象棋【动态规划】
题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...
- BZOJ1801:[Ahoi2009]chess 中国象棋
Time Limit: 10 Sec Memory Limit: 64 MB Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置 ...
- bzoj1801: [Ahoi2009]chess 中国象棋 dp
题意:在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. 题解:dp[i][j][k]表示到了第i行,有j列 ...
- BZOJ1801 [Ahoi2009]chess 中国象棋 【dp】
题目 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. 输入格式 一行包含两个整数N,M,中间用空格分开. ...
- bzoj1801[AHOI2009]CHESS中国象棋
题意:在棋盘上放一些炮使得它们不互相攻击.其实就是一行/一列最多放两个. 50分的数据中n,m至少有一个不超过8,比较直接的想法是对n/m中较小的一维做状态压缩,状态f[i][S1][S2]表示在前i ...
- 【BZOJ1801】[Ahoi2009]chess 中国象棋 DP
[BZOJ1801][Ahoi2009]chess 中国象棋 Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮 ...
随机推荐
- Linux 开机启动图形界面,shell界面
查看当前启动模式 # systemctl get-default 更改模式命令: systemctl set-default graphical.target由命令行模式更改为图形界面模式 syste ...
- TwemProxy Redis架构
TwemProxy 1.twemproxy是twitter开发的一个redis代理proxy. 通过Twemproxy可以使用多台服务器来水平扩张redis服务,可以有效的避免redis单点故障问题. ...
- Linux 流量控制总结(TC)
TC对带宽的描述: mbps = 1024 kbps = 1024 * 1024 bps => byte/s mbit = 1024 kbit => kilo bit/s. ...
- 【通信】Jave代码中生成url http请求
/** * 向指定 URL 发送POST方法的请求 * * @param url * 发送请求的 URL * @param param * 请求参数,请求参数应该是 name1=value1& ...
- 【黑客免杀攻防】读书笔记8 - 软件逆向工程基础2(if-else,三目运算符)
0x1 if-else分支 if-else分支4种状态 1.1 以常量为判断条件的简单if-else分支 C源代码: 单层if-else判断,常量为判断条件 int _tmain(int argc, ...
- malloc()函数(Linux程序员手册)及函数的正确使用【转】
转自:https://blog.csdn.net/david_xtd/article/details/7311204 名称 malloc,free,calloc,realloc--分配和释放动态内存 ...
- java项目中oracle配置说明
配置信息: #oracle database settings jdbc.url::orcl jdbc.username=cognos_data jdbc.password=cognos_data j ...
- 提高delete效率方法
1 open c_1; loop fetch c_1 bulk collect into t2 limit 100000; exit when c_1%notfound ...
- 004_i686和x86_64的区别
找回TCL隐藏分区(转载) 用Wubi安装 Ubuntu 出现(Initranfs)问题的解决方案 i686和x86_64的区别 2009-04-11 08:19:31| 分类: 电脑问题 | 标 ...
- Linux多台机器配置ssh免登录
.安装ssh. sudo apt-get install ssh. 安装完成后会在~目录(当前用户主目录,即这里的/home/xuhui)下产生一个隐藏文件夹.ssh(ls -a 可以查看隐藏文件). ...