为了在即将到来的晚会上有更好的演出效果,作为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 合唱队的更多相关文章

  1. bzoj1196:[Hnoi2010]chorus 合唱队

    这数据范围明显的区间dp啊...然而据说二维会wa...那就写三维把... #include<cstdio> #include<cstring> #include<cct ...

  2. BZOJ 1996: [Hnoi2010]chorus 合唱队(dp)

    简单的dp题..不能更水了.. --------------------------------------------------------------- #include<cstdio&g ...

  3. 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 ...

  4. 【BZOJ】1996: [Hnoi2010]chorus 合唱队【区间dp】

    1996: [Hnoi2010]chorus 合唱队 Time Limit: 4 Sec  Memory Limit: 64 MBSubmit: 2088  Solved: 1371[Submit][ ...

  5. 【BZOJ1996】[Hnoi2010]chorus 合唱队 区间DP

    [BZOJ1996][Hnoi2010]chorus 合唱队 Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Ou ...

  6. 【洛谷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]< ...

  7. bzoj 1996: [Hnoi2010]chorus 合唱队

    Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Source 因为只会在区间的两端进行 ...

  8. 1996: [Hnoi2010]chorus 合唱队

    链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1996 Description Input Output Sample Input 4 1701 ...

  9. BZOJ1996 [Hnoi2010]chorus 合唱队

    很容易想到区间DP 然后发现这个区间只和圆序列的最后一个数有关,而原序列的最后一个数只可能是现在区间的头或者尾 令$f[i][j][0/1]$表示在区间$[i, j]$之间,原序列的最后一个数是当前区 ...

随机推荐

  1. Codeforces - 1081C - Colorful Bricks - 简单dp - 组合数学

    https://codeforces.com/problemset/problem/1081/C 这道题是不会的,我只会考虑 $k=0$ 和 $k=1$ 的情况. $k=0$ 就是全部同色, $k=1 ...

  2. 位运算【C++学习(计蒜客)】

    C++提供了位运算操作符,使程序可以直接对内存进行操作.C++的这个特色大大提高了C++程序的执行能力.例如使用位操作运算可以将一个存储单位中的各个二进制位左移或右移一位,也可以将一个存储单位中所有的 ...

  3. bzoj 3238: [Ahoi2013]差异【SAM+树形dp】

    首先只有lcp(i,j)需要考虑 因为SAM的parent树是后缀的前缀的最长公共后缀(--),所以把这个串倒过来建SAM,这样就变成了求两个前缀的最长公共后缀,长度就是这两个前缀在parent树上的 ...

  4. P1223 [小数据版]边权差值最小的生成树

    这道题和最小生成树kruskal的代码几乎相同,只不过不一定是最小生成树,所以不一定从最短的边开始做生成树:所以将每一条边分别作为起点,然后枚举就行了...... #include <bits/ ...

  5. 单表:1.查询全部 2.条件查询 JSP Servlet

  6. easyUI Uncaught TypeError: Cannot read property 'length' of undefined

    dataGrid json 封装数据格式为 List<Object> 格式

  7. 洛谷 P4585 [FJOI2015]火星商店问题

    (勿看,仅作笔记) bzoj权限题... https://www.luogu.org/problemnew/show/P4585 对于特殊商品,直接可持久化trie处理一下即可 剩下的,想了一段时间c ...

  8. win10下JDK安装,配置环境变量后报Error: could not open `C:\Program Files\Java\jre1.8.0_112\lib\amd64\jvm.cfg'

    把Path里面的%JAVA_HOME%/bin放在最前面.

  9. python tkinter窗口弹出置顶的方法

    加上下面两句即可实现root窗口的置顶显示,可以用于某些程序的消息提示,能够弹出到桌面显示 root = Tk() root.wm_attributes('-topmost',1)

  10. eclipse导入php项目

    整个工程的都在一个文件夹里面 怎么把它导入到eclipse里面呢:在eclipse里新建一个与要导入的工程同名工程.