[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]$之间,原序列的最后一个数是当前区 ...
随机推荐
- Codeforces - 1033C - Permutation Game - 简单dp - 简单数论
https://codeforces.com/problemset/problem/1033/C 一开始觉得自己的答案会TLE,但是吸取徐州赛区的经验去莽了一发. 其实因为下面这个公式是 $O(nlo ...
- bzoj 1187: [HNOI2007]神奇游乐园【插头dp】
要判边界!!要判边界!!要判边界!!if(j!=m)!!! 我真是zz横着转移要判断到底能不能向右边出边-- 然后剩下的和1814差不多,九十因为不要求经过所有格子,所以左右括号随时可以合并,但是注意 ...
- bzoj 1396: 识别子串【SAM+线段树】
建个SAM,符合要求的串显然是|right|==1的节点多代表的串,设si[i]为right集合大小,p[i]为right最大的r点,这些都可以建出SAM后再parent树上求得 然后对弈si[i]= ...
- 【Tip】JavaScript
『JavaScript』 『引用网络资源』 JQuery <script src="http://code.jquery.com/jquery-latest.js">& ...
- JAVA多线程(一) Thread & Runnable
githut代码地址:https://github.com/showkawa/springBoot_2017/tree/master/spb-demo/spb-brian-query-service/ ...
- robotframework自动化系列:操作mysql数据库
随着项目自动化深入和不断完善,大部分功能都已经能完成了自动化的操作:但是在设备添加的时候,遇到了难题.添加设备的时候mac必须是服务器设备管理中已经存在的mac地址,且是没有关联或绑定用户的设备信息. ...
- jQuery笔记之工具方法—Ajax 优化回调地狱
在上一篇文我们说到了回调地狱不好的地方,今天我们看看怎么来优化它,让它可以运用到实际开发中. 什么是回调地狱?回调地狱就是一个函数里面嵌套了所有功能函数,然后缩略图形成一个三角形. 这样的代码可复用性 ...
- springMVC validator验证的使用
http://blog.csdn.net/miketom155/article/details/45058195 1. 实现Validator接口,对数据进行校验 @RequestMapping(va ...
- C++ 的浅拷贝和深拷贝(结构体)
关于浅拷贝和深拷贝这个问题遇上的次数不多,这次遇上整理一下,先说这样一个问题,关于浅拷贝的问题,先从最简单的说起. 假设存在一个结构体: struct Student { string name; i ...
- python之os、sys和random模块
import os # print(os.getcwd())#获取当前目录,绝对路径# print(os.chdir('../'))#更改当前目录,../的意思是退回上一级目录# print(os.g ...