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个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮 ...
随机推荐
- Regex实例
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- CSS进阶之模拟Bootstrap网格布局
目前暂时实现效果,容后面整理心得,先贴上源代码. 源码 <!DOCTYPE html> <html> <head> <title>demo bootst ...
- python2的比较函数,cmp
class Shu(object): def __init__(self,ss): self.ss = ss def __str__(self): return '(%s: %s)' % (self. ...
- CentOS6.4下Mysql数据库的安装与配置
原文连接:http://www.cnblogs.com/xiaoluo501395377/archive/2013/04/07/3003278.html 说到数据库,我们大多想到的是关系型数据库,比如 ...
- redis的底层数据机构
集群架构 参考 https://blog.csdn.net/wcf373722432/article/details/78678504 https://www.cnblogs.com/George19 ...
- 2、SpringBoot接口Http协议开发实战8节课(7-8)
7.SpringBoot2.x文件上传实战 简介:讲解HTML页面文件上传和后端处理实战 1.讲解springboot文件上传 MultipartFile file,源自SpringMVC 1)静态页 ...
- 定位内网中毒主机IP经历小记
一.事件起因 客户向公司反映使用IDS设备捕获到木马上线域名需要处理,虽然是逆向岗但还是有预感未来应急响应的工作只会越来越多.所以作为新人的我选择了跟带头BOSS去现场学习,并且将自己参与应急响应中的 ...
- Django 聚合与查询集API实现侧边栏
本文从Django官方文档总结而来,将聚合的主要用法和查询集的常见方法做一归纳. 聚合 1. 聚合的产生来源于django数据库查询,通常我们使用django查询来完成增删查改,但是有时候需要更复杂的 ...
- 深入分析Linux自旋锁【转】
转自:http://blog.chinaunix.net/uid-20543672-id-3252604.html 前言: 在复习休眠的过程中,我想验证自旋锁中不可休眠,所以编写了一个在自旋锁中休眠的 ...
- linux源码Makefile详解(完整)
转自:http://www.cnblogs.com/Daniel-G/p/3286614.html 随着 Linux 操作系统的广泛应用,特别是 Linux 在嵌入式领域的发展,越来越多的人开始投身到 ...