Description

为了在即将到来的晚会上有吏好的演出效果,作为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心中有一个理想队形,他想知道多少种初始队形可以获得理想的队形

solution

正解:DP
简单题啊,赋初值很坑,花了有点久
因为最终队形的产生一定是左右逐渐扩展的,所以考虑区间DP.
最后一个加入的不是区间的左端点就是右端点,我们加入状态考虑即可
设 \(dp[i][j][0/1]\),表示区间 \([i,j]\),已经形成理想队列,最后一个加入的为左/右端点的方案数
注意赋初值时一定要直接给长度为2的区间赋值

#include <algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#define RG register
using namespace std;
const int N=1005,mod=19650827;
int n,a[N],dp[N][N][2];
inline void add(RG int &x,int y){x+=y;if(x>=mod)x-=mod;}
void work()
{scanf("%d",&n);for(int i=1;i<=n;i++)scanf("%d",&a[i]);for(int i=1;i<n;i++){dp[i][i+1][0]=a[i]<a[i+1];dp[i][i+1][1]=a[i]<a[i+1];}for(int k=2;k<n;k++){for(int i=1;i+k-1<=n;i++){RG int j=i+k-1;if(i>1){if(a[i-1]<a[i])add(dp[i-1][j][0],dp[i][j][0]);if(a[i-1]<a[j])add(dp[i-1][j][0],dp[i][j][1]);}if(j<n){if(a[j+1]>a[j])add(dp[i][j+1][1],dp[i][j][1]);if(a[j+1]>a[i])add(dp[i][j+1][1],dp[i][j][0]);}}}printf("%d\n",(dp[1][n][0]+dp[1][n][1])%mod);
}int main(){work();return 0;
}

转载于:https://www.cnblogs.com/Yuzao/p/7966643.html

bzoj 1996: [Hnoi2010]chorus 合唱队相关推荐

  1. BZOJ 1996 [Hnoi2010]chorus 合唱队

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=1996 题解 区间dp,记f[i][j]表示[i,j][i,j][i,j]区间,最后一个取 ...

  2. BZOJ1996:[HNOI2010]CHORUS 合唱队(区间DP)

    Description Input Output Sample Input 4 1701 1702 1703 1704 Sample Output 8 HINT Solution 辣鸡guide真难用 ...

  3. bzoj1996 [Hnoi2010]chorus 合唱队 区间dp

    题目隐藏了一个性质,就是新加入的不是在区间最左边,就是在最右边 所以就直接根据最左边和最右边的大小关系转移就可以了 #include<iostream> #include<cstdi ...

  4. BZOJ 1997: [Hnoi2010]Planar( 2sat )

    平面图中E ≤ V*2-6.. 一个圈上2个点的边可以是在外或者内, 经典的2sat问题.. ----------------------------------------------------- ...

  5. BZOJ.2000.[HNOI2010]stone取石头游戏(博弈)

    BZOJ 洛谷 低估这道神题了_(:з」∠)_ MilkyWay好狠啊(小声) \(Description\) 有一些数字,被分成若干双端队列(从两边都可以取)和最多两个栈(只能从某一边一个一个取)的 ...

  6. bzoj 2002: [Hnoi2010]Bounce 弹飞绵羊(分块)

    2002: [Hnoi2010]Bounce 弹飞绵羊 Time Limit: 10 Sec  Memory Limit: 259 MB Submit: 10761  Solved: 5542 [Su ...

  7. BZOJ 2004 [Hnoi2010]Bus 公交线路

    题目链接 https://www.lydsy.com/JudgeOnline/problem.php?id=2004 题解 状压dp,记f[i][S]f[i][S]f[i][S]表示[1,i−p][1 ...

  8. [BZOJ 2002][Hnoi2010]Bounce 弹飞绵羊(分块)

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

  9. BZOJ 2002: [Hnoi2010]Bounce 弹飞绵羊

    Description 某天,Lostmonkey发明了一种超级弹力装置,为了在他的绵羊朋友面前显摆,他邀请小绵羊一起玩个游戏.游戏一开始,Lostmonkey在地上沿着一条直线摆上n个装置,每个装置 ...

最新文章

  1. admin及admin888 经过 md5加密后16位和32位代码
  2. BPM实例分享:如何设置表单字体样式
  3. javaSE基础之记事本编程
  4. amd cpu不能在cmd环境下运行java代码_如何在Windows10中配置java的JDK环境
  5. 70进货卖100利润是多少_一只周黑鸭随便就卖100多,那成本有多少?说出来你可能不信...
  6. 9 PP配置-生产主数据-工作中心相关-定义工序控制码
  7. stylelint rules
  8. 网络-IP/子网掩码/端口
  9. 微服务容错限流Hystrix入门
  10. 复旦nlp实验室 nlp-beginner 任务三:基于注意力机制的文本匹配
  11. 模拟电子技术基础_童诗白、华成英(第五版)目录
  12. MAVEN实战 整理 笔记
  13. gensim实现TF-IDF和LDA模型、sklearn实现聚类
  14. Django序列化器
  15. SpringBoot的优点及缺点
  16. centos7.9编译安装构建系统gn+ninja
  17. 计算机用户与权限如何设置密码,如何设置电脑用户权限_如何设置电脑使用时间...
  18. 试题 算法训练 24点
  19. java计算器课程报告_java计算器课程设计报告
  20. 关于IDEL中的全局搜索不显示该有的类的解决办法之一

热门文章

  1. 三年级计算机课画曲线,三年级上册信息技术曲线工具教案
  2. epoll nio区别_【总结】两种 NIO 实现:Selector 与 Epoll
  3. 巡回沙龙_美浮特全国巡回沙龙第一期结束撒花!
  4. html回复评论_3天内看了3000多篇《哈佛商业评论》,挑出来最有用的分享下
  5. java 字谜_计算字谜的出现次数
  6. java 继承示例_Java中的继承类型以及示例
  7. java的或等于_Java中的“小于或等于”比较运算符是__________: !=|||=|=
  8. uva 1252——Twenty Questions
  9. Linux文件与目录管理常用命令
  10. SetConsoleCursorPosition光标的位置控制