「区间DP」「洛谷P3205」「 [HNOI2010]」合唱队
洛谷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]」合唱队的更多相关文章
- 区间dp 能量项链 洛谷p1063
题目大意:如果前一颗能量珠的头标记为m,尾标记为r,后一颗能量珠的头标记为r,尾标记为n,则聚合后释放的能量为 (Mars单位),新产生的珠子的头标记为m,尾标记为n. 需要时,Mars人就用吸盘夹住 ...
- 【题解】洛谷P3205【HNOI2010】合唱队
洛谷 P3205:https://www.luogu.org/problemnew/show/P3205 复习区间DPing 思路 把理想队列拆分成 第一个和后面几个 划分成求后面几个的理想队列 最后 ...
- 「区间DP」「洛谷P1043」数字游戏
「洛谷P1043」数字游戏 日后再写 代码 /*#!/bin/sh dir=$GEDIT_CURRENT_DOCUMENT_DIR name=$GEDIT_CURRENT_DOCUMENT_NAME ...
- 「区间DP」「洛谷PP3146 」[USACO16OPEN]248 G
[USACO16OPEN]248 G 题目: 题目描述 Bessie likes downloading games to play on her cell phone, even though sh ...
- 洛谷P3205 [HNOI2011]合唱队 DP
原题链接点这里 今天在课上听到了这个题,听完后觉得对于一道\(DP\)题目来说,好的状态定义就意味着一切啊! 来看题: 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需 ...
- 洛谷 P3205 [HNOI2010]合唱队 解题报告
P3205 [HNOI2010]合唱队 题目描述 为了在即将到来的晚会上有更好的演出效果,作为AAA合唱队负责人的小A需要将合唱队的人根据他们的身高排出一个队形.假定合唱队一共N个人,第i个人的身高为 ...
- BZOJ3065 带插入区间K小值 || 洛谷P4278
这是一道让我崩溃的题...... 然鹅洛谷上时限被改然后只有20分......好像所有人都被卡了(雾) 由于替罪羊树不是依靠旋转操作而是依靠暴力重构的方式维护树的平衡,所以我们可以考虑使用替罪羊树套区 ...
- 斜率优化dp学习笔记 洛谷P3915[HNOI2008]玩具装箱toy
本文为原创??? 作者写这篇文章的时候刚刚初一毕业…… 如有错误请各位大佬指正 从例题入手 洛谷P3915[HNOI2008]玩具装箱toy Step0:读题 Q:暴力? 如果您学习过dp 不难推出d ...
- DP,数论————洛谷P4317 花神的数论题(求1~n二进制中1的个数和)
玄学代码(是洛谷题解里的一位dalao小粉兔写的) //数位DP(二进制)计算出f[i]为恰好有i个的方案数. //答案为∏(i^f[i]),快速幂解决. #include<bits/stdc+ ...
随机推荐
- mac下使用VMVARE安装win10虚拟机的一些坑
最近Mac上安装windows踩到了几个坑: 坑一:启动虚拟机后,提示找不到CD-ROM中找不到对应的ISO文件 硬盘格式请选择 在虚拟机->设置中选择启动磁盘为CD_ROM,然后重新启动. 坑 ...
- Entity Framework Core遇到的问题汇总
1.add-migration : 无法将“add-migration”项识别为 cmdlet.函数.脚本文件或可运行程序的名称.请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次. 使用E ...
- [go设计模式]工厂方法模式
简单工厂就是生产整个计算器,而工厂方法只生产计算器的一部分: 原有的简单工厂可以生'+' '-' '*' '/' ;但是如果添加新的部件'%',厂房就 需要扩充.修改很可以会影响原来部件的正常生产,这 ...
- [转] Ubuntu的apt-get 设置代理的方法
点击阅读原文 新立得软件管理器这种图形化的代理设置很明了,这里介绍下终端命令行的网络代理设置,这样大家就可以通过代理进行apt-get了. 方法一: 如果只是想临时使用http代理,可以在使用apt- ...
- ios swift 知识点记录
1. 定义变量 var name = "***" 定义常量 let name ="*****" 2. swift 变量类型 String, Int, Fl ...
- TensorFlow从0到1之TensorFlow超参数及其调整(24)
正如你目前所看到的,神经网络的性能非常依赖超参数.因此,了解这些参数如何影响网络变得至关重要. 常见的超参数是学习率.正则化器.正则化系数.隐藏层的维数.初始权重值,甚至选择什么样的优化器优化权重和偏 ...
- postman获得时间戳和md5加密的方法
注意点:记得用postman.setGlobalVariable设置全局变量,不然{{strmd5}}这种变量取不到值
- Linux下配置tomcat
我们可以在用户目录下新建一个tomcat目录 mkdir tomcat ls cd tomcat/ 使用wget命令下载tomcat的压缩包 wget https://downloads.apache ...
- 【环境安装】Docker安装
[环境安装]Docker安装 CentoOS-7 安装步骤: 1.卸载已经安装的Docker sudo yum remove docker \ docker-client \ docker-clien ...
- 学员操作——制作5s关闭广告
<!DOCTYPE html><html> <head> <meta charset="utf-8"> <title>广 ...