BZOJ1801:[AHOI2009]中国象棋——题解
http://www.lydsy.com/JudgeOnline/problem.php?id=1801
https://www.luogu.org/problemnew/show/P2051
这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法。大家肯定很清楚,在中国象棋中炮的行走方式是:一个炮攻击到另一个炮,当且仅当它们在同一行或同一列中,且它们之间恰好 有一个棋子。你也来和小可可一起锻炼一下思维吧!
我思维断掉了,秉承着dp试图自己做出来。
先想到dp方程有一维一定是处理到第几行,剩下的就是前几行的状态。
考虑状压……emm这100的大小状压可承受不起啊。
稍等,一列最多就两个炮啊!
我们完全可以用一种三维进制表示出每一列有多少个炮,这是是50%的做法。
正解延续了这个思想,显然我们只需要记住有多少列有0/1/2炮,经过奇妙的转移就能得到结果。
(然后斜挂不可避……)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll p=;
int n,m;
ll f[][][];
int main(){
scanf("%d%d",&n,&m);
f[][][]=;
for(int i=;i<n;i++){
for(int j=;j<=m;j++){
for(int k=;k+j<=m;k++){
int l=m-j-k;
f[i+][j][k]=(f[i+][j][k]+f[i][j][k])%p;
if(l>)f[i+][j+][k]=(f[i+][j+][k]+f[i][j][k]*l)%p;
if(j>)f[i+][j-][k+]=(f[i+][j-][k+]+f[i][j][k]*j)%p;
if(l>)f[i+][j+][k]=(f[i+][j+][k]+f[i][j][k]*l*(l-)/)%p;
if(l>&&j>)f[i+][j][k+]=(f[i+][j][k+]+f[i][j][k]*l*j)%p;
if(j>)f[i+][j-][k+]=(f[i+][j-][k+]+f[i][j][k]*j*(j-)/)%p;
}
}
}
ll ans=;
for(int j=;j<=m;j++){
for(int k=;k+j<=m;k++){
ans=(ans+f[n][j][k])%p;
}
}
printf("%lld\n",ans);
return ;
}
+++++++++++++++++++++++++++++++++++++++++++
+本文作者:luyouqi233。 +
+欢迎访问我的博客:http://www.cnblogs.com/luyouqi233/+
+++++++++++++++++++++++++++++++++++++++++++
BZOJ1801:[AHOI2009]中国象棋——题解的更多相关文章
- [BZOJ1801][AHOI2009]中国象棋(递推)
题目:http://www.lydsy.com:808/JudgeOnline/problem.php?id=1801 分析: 只会50的状态压缩…… 然后搜了下题解,发现是dp 首先易得每行每列至多 ...
- bzoj1801 [Ahoi2009]中国象棋
Description 在N行M列的棋盘上,放若干个炮可以是0个,使得没有任何一个炮可以攻击另一个炮. 请问有多少种放置方法,中国像棋中炮的行走方式大家应该很清楚吧. Input 一行包含两个整数N, ...
- [洛谷P2051] [AHOI2009]中国象棋
洛谷题目链接:[AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法 ...
- 洛谷 P2051 [AHOI2009]中国象棋 解题报告
P2051 [AHOI2009]中国象棋 题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法. ...
- luogu 2051 [AHOI2009]中国象棋
luogu 2051 [AHOI2009]中国象棋 真是一道令人愉♂悦丧心并框的好题... 首先"没有一个炮可以攻击到另一个炮"有个充分条件就是没有三个炮在同一行或同一列.证明:显 ...
- 洛谷 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 显然搜索,直接 ...
- [AHOI2009]中国象棋 BZOJ1801 dp
题目描述 这次小可可想解决的难题和中国象棋有关,在一个N行M列的棋盘上,让你放若干个炮(可以是0个),使得没有一个炮可以攻击到另一个炮,请问有多少种放置方法.大家肯定很清楚,在中国象棋中炮的行走方式是 ...
随机推荐
- redis 学习笔记三
一.redis 复制 数据库复制指的是发生在不同数据库实例之间,单向的信息传播的行为,通常由被复制方和复制方组成,被复制方和复制方之间建立网络连接,复制方式通常为被复制方主动将数据发送到复制方,复制方 ...
- JEMTER简单的测试计划
测试计划一 1)测试网站:http://www.geneedu.cn/和http://supu01.1688.com/ 2)测试目的是该网站在负载达到20 QPS 时的响应时间. 备注: QPS : ...
- 爬虫初体验:Python+Requests+BeautifulSoup抓取广播剧
可以看到一个DIV下放一个广播剧的信息,包括名称和地址,第一步我们先收集所有广播剧的收听地址: # 用requests的get方法访问novel_list_resp = requests.get(&q ...
- fiddler不经意的功能
捕获指定客户端的请求,直接食用 窗口分离,直接食用 Hide this column 隐藏此列Ensure all columns are visible 显示默认所有列Customize co ...
- 软件测试的基础-摘自《selenium实践-基于电子商务平台》
软件测试的方法 一.等价类划分法 等价类划分法是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少量具有代表性的数据作为测试用例. 有两种不同的情况:有效等价和无效等 ...
- Oracle存储过程练习题
1.1.创建一个过程,能向dept表中添加一个新记录.(in参数) 创建过程 create or replace procedure insert_dept ( num_dept in number, ...
- 一个五位数ABCDE乘以9,得到EDCBA,求此五位数
此题是面试时某面试官突然抛出的,要求逻辑分析推导,不许编码,5分钟时间算出来最终结果,当然,最终没有完全推算出来 下面是编码实现 #一个五位数ABCDE*9=EDCBA,求此数 for a in ra ...
- HADOOP/HDFS Essay
HDFS架构 the core of HADOOP/distributed systems is storeage(HDFS) and resource manager(YARN) for compu ...
- iconFont 阿里巴巴矢量图标使用方法
挑选图标的过程(共6步) 进入网站:Iconfont网址:http://www.iconfont.cn 点击网站上方的“官方图标库”,选择自己喜欢的图标.在这里我选择天猫的图标库. 选择好自己喜欢的图 ...
- Java学习个人备忘录之面向对象概念
对象,其实就是该类事物实实在在存在的个体. 类与对象之间的关系?类:一类事物的描述.对象:该类事物的实例.在java中通过new来创建的.举例来说,类就是汽车说明书,类只能在理论上造一辆汽车,并且这个 ...