洛谷P3205 [HNOI2010]合唱队

题目:

题目描述

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

请求出答案对 196508271 取模的值。

输入格式

第一行一个整数 n。

第二行 n 个整数,表示小 A 心中的理想队形。

输出格式

输出一行一个整数,表示答案  % 19650827 的值。

输入输出样例

输入 #1

4

1701 1702 1703 1704

输出 #1

8

思路:

第一次遇到多状态的区间DP题,思考时间有点长

由于总共有两种插入方式:大于前一数就放在右边,小于前一数就放在左边,由此可衍生出两种状态:新插入的数在最左边和新插入的数在最右边

因为求得是到达最后序列的方案,就可以这样想:有多少种可能是可以到达最后序列的,可能说的不太清楚,往下看

枚举一段区间i~j,新插入的数要么在最左端要么在最右端,所以f[0][i][j](0代表在左端插入,1相反,而f[0][i][j]则代表新插入的数在左端的所有可能序列)之前的数要么是原始序列最左端的数a[i+1]要么是最右端的数a[j],所以f[0][i][j]可以从这两个状态转移过来,前提是符合条件新插在左端a[i]要小于之前的数,f[1][i][j]同理

接着是初状态(貌似所有区间DP初状态都得想一会),i==j肯定只有一种可能,所以把f[0][i][i]都置为1。为什么不把f[1][i][i]也置为1呢,因为i==j代表只有一个人时的方案,只有一个人时只有一种可能,总方案数f[0][i][i]+f[1][i][i]=1

参考于洛谷第一篇博客

代码:

/*#!/bin/sh
dir=$GEDIT_CURRENT_DOCUMENT_DIR
name=$GEDIT_CURRENT_DOCUMENT_NAME
pre=${name%.*}
g++ -O2 $dir/$name -o $pre -g -Wall -std=c++11
if test $? -eq 0; then
gnome-terminal -x bash -c "time $dir/$pre;echo;read;"
fi*/
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cmath>
using namespace std;
const int maxn=2e3+5,INF=0x3f3f3f3f;
int n,f[2][maxn][maxn],a[maxn];//0左 1右
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')s=s*10+ch-'0',ch=getchar();
return s*w;
}
int main(){
n=read();
for(int i=1;i<=n;i++)a[i]=read();
for(int i=1;i<=n;i++)f[1][i][i]=1;
for(int d=2;d<=n;d++){
for(int i=1,j;(j=i+d-1)<=n;i++){
if(a[i]<a[i+1])f[0][i][j]+=f[0][i+1][j];
if(a[i]<a[j])f[0][i][j]+=f[1][i+1][j];//左端插入的情况,共两种可能
if(a[j]>a[j-1])f[1][i][j]+=f[1][i][j-1];
if(a[j]>a[i])f[1][i][j]+=f[0][i][j-1];//右端插入的情况,共两种可能
f[1][i][j]%=19650827;
f[0][i][j]%=19650827;
}
}
cout<<(f[1][1][n]+f[0][1][n])%19650827; }

over~

「区间DP」「洛谷P3205」「 [HNOI2010]」合唱队的更多相关文章

  1. 区间dp 能量项链 洛谷p1063

    题目大意:如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为 (Mars单位),新产生的珠子的头标记为m,尾标记为n. 需要时,Mars人就用吸盘夹住 ...

  2. 【题解】洛谷P3205【HNOI2010】合唱队

    洛谷 P3205:https://www.luogu.org/problemnew/show/P3205 复习区间DPing 思路 把理想队列拆分成 第一个和后面几个 划分成求后面几个的理想队列 最后 ...

  3. 「区间DP」「洛谷P1043」数字游戏

    「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...

  4. 「区间DP」「洛谷PP3146 」[USACO16OPEN]248 G

    [USACO16OPEN]248 G 题目: 题目描述 Bessie likes downloading games to play on her cell phone, even though sh ...

  5. 洛谷P3205 [HNOI2011]合唱队 DP

    原题链接点这里 今天在课上听到了这个题,听完后觉得对于一道\(DP\)题目来说,好的状态定义就意味着一切啊! 来看题: 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需 ...

  6. 洛谷 P3205 [HNOI2010]合唱队 解题报告

    P3205 [HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为 ...

  7. BZOJ3065 带插入区间K小值 || 洛谷P4278

    这是一道让我崩溃的题...... 然鹅洛谷上时限被改然后只有20分......好像所有人都被卡了(雾) 由于替罪羊树不是依靠旋转操作而是依靠暴力重构的方式维护树的平衡,所以我们可以考虑使用替罪羊树套区 ...

  8. 斜率优化dp学习笔记 洛谷P3915[HNOI2008]玩具装箱toy

    本文为原创??? 作者写这篇文章的时候刚刚初一毕业…… 如有错误请各位大佬指正 从例题入手 洛谷P3915[HNOI2008]玩具装箱toy Step0:读题 Q:暴力? 如果您学习过dp 不难推出d ...

  9. DP,数论————洛谷P4317 花神的数论题(求1~n二进制中1的个数和)

    玄学代码(是洛谷题解里的一位dalao小粉兔写的) //数位DP(二进制)计算出f[i]为恰好有i个的方案数. //答案为∏(i^f[i]),快速幂解决. #include<bits/stdc+ ...

随机推荐

  1. Python之Flask框架二

    今天接着上一篇继续写一篇关于flask的随笔. 本文大纲: 1.获取请求参数 2.一个函数处理多个请求方式 3.重定向 4.错误响应 5.全局错误处理 6.返回json格式数据 7.自定义返回内容状态 ...

  2. opencl(4)命令队列

    1:创建命令队列 cl_command _queue  clCreateCommandQueue( cl_context context,   //上下文 cl_device_id device,   ...

  3. JDK Base64编解码1.7和1.8的坑

    场景 对接一个第三方api接口,其中签名部分用的是JDK8的编码.我们线上采用JDK7,导致项目无法编译 替换编解码部分为1.7的代码,然后签名又不对 所以坑就在这里,结论,1.7的编解码有换行符导致 ...

  4. Linux系统命令详解

    目录 1. su 1.1. su命令中passwd的自动输入 2. sshpass 3. locate/mlocate 4. top/htop 5. lftp 6. kill/killall 1. s ...

  5. 用了那么多年的 Master 分支或因种族歧视而成为历史?

    最近真的是活久见了...不知道你是否也有碰到之前Fork过的国外开源项目,最近突然崩了,原因居然是好多项目都把master分支改为了main分支!更可怕的是修改原因居然是涉及种族歧视.用了那么多年的m ...

  6. visual studio 2005/2010/2013/2015/2017 vc++ c#代码编辑常用快捷键-代码编辑器的展开和折叠

    visual studio 2005/2010/2013/2015/2017 vc++ c#代码编辑快捷键-代码编辑器的展开和折叠 VS2015代码编辑器的展开和折叠代码确实很方便和实用.以下是展开代 ...

  7. elk2

    如果使用codec->json进行解码,表示输入到logstast中的input数据必须是json的格式,否则会解码失败 java中一句代码异常会抛出多条的堆栈日志,我们可以使用上面的mutil ...

  8. Jmeter系列(32)- 详解 CSV 数据文件设置

    如果你想从头学习Jmeter,可以看看这个系列的文章哦 https://www.cnblogs.com/poloyy/category/1746599.html 了解一哈什么是 CSV 文件 为了实现 ...

  9. LIMS产品 - Labware

    软件架构 客户端:Labware软件,部分C/S功能 Web服务:Apache Tomcat等,部分B/S功能 后台服务:计划.调度程序,环境监控样.稳定性研究等 数据库驱动:ODBC 报表工具:水晶 ...

  10. pick靶场-sql注入

    甲.数字型注入 数字型注入一般提交值没有引号,所以直接在后面构造语句就可以了. 抓包查看 构造语句 提交后 该数据库表内容被爆出来了. 乙.字符型注入 首先我们要知道一点,字符串在数据库中提交是需要用 ...