[LUOGU] P3205 [HNOI2010]CHORUS 合唱队
为了在即将到来的晚会上有更好的演出效果,作为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
输入输出样例
输入样例#1:
4
1701 1702 1703 1704
输出样例#1:
8
说明
30%的数据:n<=100
100%的数据:n<=1000
往区间dp上考虑
最终状态一定是f[1][n] 所以就把它划分成一个个小点的区间
加一个数只能在一个小区间的左边或右边,所以
f[i][j]可以由f[i+1][j]和f[i][j-1] 转移过来
但是这样无法转移,所以考虑加一维
f[i][j][0/1] 0表示左边加了一个,1表示右边加了一个
f[i+1][j][0/1] 缺了左边一个 所以一定是向f[i][j][0]转移的
同理 f[i][j][1]由f[i][j-1][0/1]转移来
具体0和1,是看新加的这一位和小区间的左右(0/1)的大小关系
比如 f[i][[j][0] <- f[i+1][j][1]
这就是[i+1,j]转移到了[i,j] 加的一位是val[i] 而小区间[i-1][j]是又右(1)转移来的
所以判断val[i]和val[j] 根据题目所给左小右大(符合直觉的。)
if(val[i]<val[j]) f[i][j][0]+=f[i+1][j][1];
类似可推出剩下3个式子
由于是大区间依赖小区间,由短的向长的转移,所以最外层是长度len,第二层是左端点l,r=l+len
O(n^2)
//Stay foolish,stay hungry,stay young,stay simple
#include<iostream>
using namespace std;
const int MAXN=1005;
const int MOD=19650827;
int n;
int a[MAXN];
int f[MAXN][MAXN][2];
int main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int l=1;l<=n;l++){
f[l][l][0]=1;
}
for(int len=1;len<=n;len++){
for(int l=1;l+len<=n;l++){
int r=l+len;
if(a[l+1]>a[l]) f[l][r][0]+=f[l+1][r][0];
if(a[r]>a[l]) f[l][r][0]+=f[l+1][r][1];
if(a[l]<a[r]) f[l][r][1]+=f[l][r-1][0];
if(a[r-1]<a[r]) f[l][r][1]+=f[l][r-1][1];
f[l][r][0]%=MOD;
f[l][r][1]%=MOD;
}
}
cout<<(f[1][n][0]+f[1][n][1])%MOD;
return 0;
}
[LUOGU] P3205 [HNOI2010]CHORUS 合唱队的更多相关文章
- bzoj1196:[Hnoi2010]chorus 合唱队
这数据范围明显的区间dp啊...然而据说二维会wa...那就写三维把... #include<cstdio> #include<cstring> #include<cct ...
- BZOJ 1996: [Hnoi2010]chorus 合唱队(dp)
简单的dp题..不能更水了.. --------------------------------------------------------------- #include<cstdio&g ...
- bzoj千题计划211:bzoj1996: [Hnoi2010]chorus 合唱队
http://www.lydsy.com/JudgeOnline/problem.php?id=1996 f[i][j][0/1] 表示已经排出队形中的[i,j],最后一个插入的人在[i,j]的i或j ...
- 【BZOJ】1996: [Hnoi2010]chorus 合唱队【区间dp】
1996: [Hnoi2010]chorus 合唱队 Time Limit: 4 Sec Memory Limit: 64 MBSubmit: 2088 Solved: 1371[Submit][ ...
- 【BZOJ1996】[Hnoi2010]chorus 合唱队 区间DP
[BZOJ1996][Hnoi2010]chorus 合唱队 Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Ou ...
- 【洛谷P3205】[HNOI2010]CHORUS 合唱队
合唱队 区间DP f[l][r][0/1]表示生成目标序列中的区间[l,r],最后一个数是a[l]/a[r] 的方案数 边界: f[i][i][0]=1 转移: f[l][r][0]=(a[l]< ...
- bzoj 1996: [Hnoi2010]chorus 合唱队
Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Source 因为只会在区间的两端进行 ...
- 1996: [Hnoi2010]chorus 合唱队
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1996 Description Input Output Sample Input 4 1701 ...
- BZOJ1996 [Hnoi2010]chorus 合唱队
很容易想到区间DP 然后发现这个区间只和圆序列的最后一个数有关,而原序列的最后一个数只可能是现在区间的头或者尾 令$f[i][j][0/1]$表示在区间$[i, j]$之间,原序列的最后一个数是当前区 ...
随机推荐
- TP5之自定义分页样式
分页样式为 在extend\目录下创建page目录,在page目录下创建Page.php文件,将以下代码放入文件中. <?php namespace page; use think\Pagina ...
- C++笔试题(四)
华为从事通信网络技术与产品的研究.开发.生产与销售,是中国电信市场的主要供应商之一,并已成功进入全球电信市场.每年华为都要在各大高校招聘大批的应界生,特别是华中科技大学.公司网址是:http://ww ...
- 【UVA - 10474 】Where is the Marble?(排序)
Where is the Marble? Descriptions: Raju and Meena love to play with Marbles. They have got a lot of ...
- Django models数据库配置以及多数据库调用设置
今天来说说web框架Django怎么配置使用数据库,也就是传说中MVC(Model View Controller)中的M,Model(模型). 简单介绍一下Django中的MVC: 模型(model ...
- MYSQL性能调优与架构设计之select count(*)的思考
select count(*)的思考 原文:MYSQL性能调优与架构设计 举例: 这里我们就拿一个看上去很简单的功能来分析一下. 需求:一个论坛帖子总量的统计 附加要求:实时更新 在很多人看来,这 ...
- Qt容器类之二:迭代器
一.介绍 遍历一个容器可以使用迭代器(iterators)来完成,迭代器提供了一个统一的方法来访问容器中的项目.Qt的容器类提供了两种类型的迭代器:Java风格迭代器和STL风格迭代器.如果只是想按顺 ...
- LCA+树状数组 POJ 2763 Housewife Wind
题目传送门 题意:两种操作,问u到v的距离,并且u走到了v:把第i条边距离改成w 分析:根据DFS访问顺序,将树处理成链状的,那么回边处理成负权值,那么LCA加上BIT能够知道u到v的距离,BIT存储 ...
- D. The Door Problem 带权并查集
http://codeforces.com/contest/776/problem/D 注意到每扇门都有两个东西和它连接着,那么,如果第i扇门的状态是1,也就是已经打开了,那么连接它的两个按钮的状态应 ...
- P2006 赵神牛的游戏
题目描述 在DNF 中,赵神牛有一个缔造者,他一共有k点法力值,一共有m个技能,每个技能耗费的法力值为a[i],可以造成的伤害为b[i],而boss 的体力值为n,请你求出它放哪个技能,才可以打死bo ...
- WebForm中 页面传参的总结
页面与后台的数据传递是实现动态页面的前提---数据交互.无论是MVC还是WebFrom 都需要详细了解各种前后台的数据传输方式,熟悉每种方式的优缺点,这样才能提高网站的性能,技术上得到锻炼. 1.Fo ...