洛谷P3205 [HNOI2011]合唱队 DP
原题链接点这里
今天在课上听到了这个题,听完后觉得对于一道\(DP\)题目来说,好的状态定义就意味着一切啊!
来看题:
题目描述
为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形。假定合唱队一共N个人,第i个人的身高为Hi米(1000<=Hi<=2000),并已知任何两个人的身高都不同。假定最终排出的队形是A 个人站成一排,为了简化问题,小A想出了如下排队的方式:他让所有的人先按任意顺序站成一个初始队形,然后从左到右按以下原则依次将每个人插入最终棑排出的队形中:
-第一个人直接插入空的当前队形中。
-对从第二个人开始的每个人,如果他比前面那个人高(H较大),那么将他插入当前队形的最右边。如果他比前面那个人矮(H较小),那么将他插入当前队形的最左边。
当N个人全部插入当前队形后便获得最终排出的队形。
例如,有6个人站成一个初始队形,身高依次为1850、1900、1700、1650、1800和1750,
那么小A会按以下步骤获得最终排出的队形:
1850
1850 , 1900 因为 1900 > 1850
1700, 1850, 1900 因为 1700 < 1900
1650 . 1700, 1850, 1900 因为 1650 < 1700
1650 , 1700, 1850, 1900, 1800 因为 1800 > 1650
1750, 1650, 1700,1850, 1900, 1800 因为 1750 < 1800
因此,最终排出的队形是 1750,1650,1700,1850, 1900,1800
小A心中有一个理想队形,他想知道多少种初始队形可以获得理想的队形
输出格式:
注意要mod19650827
说明
30%的数据:n<=100
100%的数据:n<=1000
首先,不难发现这样的队列一定有一个性质,对于每次完成加人操作后的队列,它一定是最终队列的一个子区间。于是我们就可以用区间DP来搞这道题了。
下面的这个状态定义,非常的巧妙(不可能的,我这一辈子都是不可能想出来的):
令\(h[i]\)为最终队列第i个人的身高,\(f[l][r][0], f[l][r][1]\)分别为对于区间\([l,r]\)最后一次加人是在左边,和在右边的方案数,不难yy出转移方程如下:
\(f[l][r][0] = f[l+1][r][0]*(h[l+1]>h[l])+f[l+1][r][1]*(h[r]>h[l])\)
\(f[l][r][1] = f[l][r-1][0]*(h[l]<h[r])+f[l][r-1][1]*(h[r-1]<h[r])\)
然后我们就可以按照先枚举长度,再枚举起点的区间\(DP\)的套路来转移了(▽)
上代码
#include <iostream>
using namespace std;
const int N = 1005, mod = 19650827;
int n, h[N], f[N][N][2]; //0代表左边 1代表右边
int main() {
ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0); //读入优化
cin >> n;
for(int i = 1; i <= n; i++) cin >> h[i], f[i][i][0] = 1; //初始化
for(int k = 2; k <= n; k++) //枚举长度
for(int i = 1; i+k-1 <= n; i++) { //枚举起点
int l = i, r = i+k-1;
f[l][r][0] = (f[l+1][r][0]*(h[l+1]>h[l])+f[l+1][r][1]*(h[r]>h[l]))%mod; //状态转移
f[l][r][1] = (f[l][r-1][0]*(h[l]<h[r])+f[l][r-1][1]*(h[r-1]<h[r]))%mod;
}
cout << (f[1][n][0]+f[1][n][1])%mod; //最终答案为最后一次加人在左边和在右边的和
return 0;
}
洛谷P3205 [HNOI2011]合唱队 DP的更多相关文章
- 洛谷 P3205 [HNOI2010]合唱队 解题报告
P3205 [HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为 ...
- 洛谷——P3205 [HNOI2010]合唱队
P3205 [HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为 ...
- 洛谷 P3205 [HNOI2010]合唱队(区间dp)
传送门 解题思路 观察队形的组成方式可以得出,最后一名加入区间i...j的人要么是在i位置上,要么是在j位置上,所以我们可以用dp[i][j][0]表示区间i...j最后一个加入的人站在i位置上的方案 ...
- [洛谷P3205] HNOI2010 合唱队
问题描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为Hi米(1000<=Hi<= ...
- 洛谷 P3205 [HNOI2010]合唱队
题目链接 题解 区间dp \(f[i][j]\)表示i~j区间最后一次插入的是\(a[i]\) \(g[i][j]\)表示i~j区间最后一次插入的是\(a[j]\) 然后就是普通区间dp转移 Code ...
- 「区间DP」「洛谷P3205」「 [HNOI2010]」合唱队
洛谷P3205 [HNOI2010]合唱队 题目: 题目描述 为了在即将到来的晚会上有更好的演出效果,作为 A 合唱队负责人的小 A 需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共 n 个 ...
- 【题解】洛谷P3205【HNOI2010】合唱队
洛谷 P3205:https://www.luogu.org/problemnew/show/P3205 复习区间DPing 思路 把理想队列拆分成 第一个和后面几个 划分成求后面几个的理想队列 最后 ...
- 洛谷 P3214 - [HNOI2011]卡农(线性 dp)
洛谷题面传送门 又是一道我不会的代码超短的题( 一开始想着用生成函数搞,结果怎么都搞不粗来/ll 首先不妨假设音阶之间存在顺序关系,最终答案除以 \(m!\) 即可. 本题个人认为一个比较亮的地方在于 ...
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
随机推荐
- 拉勾网爬取全国python职位并数据分析薪资,工作经验,学历等信息
首先前往拉勾网“爬虫”职位相关页面 确定网页的加载方式是JavaScript加载 通过谷歌浏览器开发者工具分析和寻找网页的真实请求,确定真实数据在position.Ajax开头的链接里,请求方式是PO ...
- CentOS7中利用Xshell6向虚拟机本地上传文件
环境交代 Linux系统:CentOS7, Xshell版本:6 操作步骤 下面我们以一个文件上传来演示用法 第一步 建立连接,这里不多说 在Xshell中点击如下图标,或者直接按 Alt+Ctrl+ ...
- JDBC获得连接时报connection refused
1,检查数据库服务器的IP是否正确. 2,检查用户名密码是否正确. 3,检查SID,获selecte instance_name from v$instance;
- 【English】20190328
Emotions情绪 [ɪ'moʊʃənz] Run Your Life for Teens影响你的青少年生活[ti:nz] Don't Let Your Emotions Run Your Lif ...
- web框架开发-模板层
你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now = datet ...
- 前端学习-基础部分-css(二)
开始今日份整理,今日主要是CSS中很重要的一部分,就是盒模型,浮动,定位属性 1.盒模型 1.1 特性: 当对一个文档(网页)进行布局的时候,浏览器渲染引擎会根据CSS-Box模型(盒子模型)将所有元 ...
- 在IIS上部署(托管).NET Core站点
部署教程 操作系统要求 Windows 7 或更高版本 Windows Server 2008 R2 或更高版本 依赖的组件 Runtime & Hosting Bundle image. ...
- python之UUID
#!/usr/bin/python # -*- coding: UTF- -*- import uuid ''' uuid1():这个是根据当前的时间戳和MAC地址生成的,最后的12个字符408d5c ...
- IntelliJ IDEA编译项目报错 "xxx包不存在" 或 "找不到符号"
简介 在维护一个新的项目时出现在的这个情况,项目构建时一直报错"xxx包找不到",但是引用的包和引用的类都是存在的,一开始以为是项目问题,还问了做过的同事,第一次搞好了,但是换了分 ...
- .NET 开源项目 Anet 介绍
使用 Anet 有一段时间了,已经在我的个人网站(如 bookist.cc)投入使用,目前没有发现什么大问题,所以才敢写篇文章向大家介绍. GitHub 地址:https://github.com/a ...