[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]$之间,原序列的最后一个数是当前区 ...
随机推荐
- C++章节练习题
笔试宝典:http://www.bishibaodian.com/writtenCircle/lightquestionlist http://www.bishibaodian.com/written ...
- hdoj1097
好久没有遇到过这样的题,似乎记得以前完全就是靠规律啊什么的.... 然后刚刚看到,这不就是快速幂取膜就好了嘛- #include <stdio.h> #include <string ...
- ExtWebComponents
我们很高兴地宣布Sencha ExtWebComponents的早期版本现已推出.ExtWebComponents提供了数百个预构建的UI组件,您可以轻松地将它们集成到使用任何框架构建的Web应用程序 ...
- pip查看安装包的可安装版本
不需要下载或者安装任何其他软件包,你可以指定一个高得离谱的版本号( 不可能有实际安装候选),并且可用的版本将被打印: pip install scrapy==122222 得到信息后指定版本就好了 p ...
- Caffe实战一(环境准备及CPU模式下编译)
经过前几天的折腾,终于把Ubuntu16.04开发环境给搭建了起来,包括win10+Ubuntu双系统的安装.系统安装后的优化等等. 详见之前的文章:Ubuntu16.04.2 LTS 64bit系统 ...
- April Fools Contest 2017 F
Description You are developing a new feature for the website which sells airline tickets: being able ...
- Palindrome Partitioning LightOJ - 1044(回文串最小分割数,O(n^2)预处理子串是否回文)
题意:将一个字符串分割成最少的字符串,使得分割出的每个字符串都是回文串.输出最小的分割数. 方法(自己的):先O(n^2)(用某个点或某个空区间开始,每次向左右扩展各一个的方法)处理出所有子串是否回文 ...
- android动画(2)自定义动画
public class CustomAnimation extends Animation { // 这个方法可以获得动画view的width,height,以及它父view的width @Over ...
- POJ 1692 Crossed Matchings dp[][] 比较有意思的dp
http://poj.org/problem?id=1692 这题看完题后就觉得我肯定不会的了,但是题解却很好理解.- - ,做题阴影吗 所以我还是需要多思考. 题目是给定两个数组,要求找出最大匹配数 ...
- java中stringBuilder的用法
java中stringBuilder的用法 String对象是不可改变的.每次使用 System.String类中的方法之一时,都要在内存中创建一个新的字符串对象,这就需要为该新对象分配新的空间.在需 ...