题目描述

$N$位同学站成一排,音乐老师要请其中的$\left ( N-K\right )$位同学出列,使得剩下的$K$位同学排成合唱队形。

合唱队形是指这样的一种队形:设$K$位同学从左到右依次编号为$1,2,...,K$,他们的身高分别为$T_{1},T_{2},...,T_{K}$​, 则他们的身高满足$T_{1}< ...<T_{i}>T_{i+1}>...>T_{K}\left ( 1\leqslant i\leqslant K\right )$。

你的任务是,已知所有$N$位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

输入格式

共二行。

第一行是一个整数$N\left ( 2\leqslant N\leqslant 100\right )$,表示同学的总数。

第二行有$N$个整数,用空格分隔,第$i$个整数$T_{i}\left ( 130\leqslant T_{i}\leqslant 230\right )$是第$i$位同学的身高(厘米)。

输出格式

一个整数,最少需要几位同学出列。

样例数据

输入

8
186 186 150 200 160 130 197 220

输出

4

分析

根据题目信息,可将题目翻译为:在一组数据中找到除最长不下降子序列与最长不上升子序列以外的数的个数

$Dp_{i}$表示从$1$到$i$的最长不下降子序列的长度,至于最长不上升的子序列长度求法,就是循环倒过来,继续求最长不下降子序列长度

$Dp\underline{ }UP$表示$T_{i}$之前序列长度,$Dp\underline{ }DOWN$表示$T_{i}$之后的序列长度

状态转移方程

代码

#include <bits/stdc++.h>

#define Enter puts("")
#define Space putchar(' ') using namespace std; typedef long long ll;
typedef double Db; inline ll Read()
{
ll Ans = 0;
char Ch = getchar() , Las = ' ';
while(!isdigit(Ch))
{
Las = Ch;
Ch = getchar();
}
while(isdigit(Ch))
{
Ans = (Ans << 3) + (Ans << 1) + Ch - '0';
Ch = getchar();
}
if(Las == '-')
Ans = -Ans;
return Ans;
} inline void Write(ll x)
{
if(x < 0)
{
x = -x;
putchar('-');
}
if(x >= 10)
Write(x / 10);
putchar(x % 10 + '0');
} int T[100001];
int Dp_UP[100001];
int Dp_DOWN[100001];
int Ans; int main()
{
int n;
n = Read();
for(int i = 1; i <= n; i++)
T[i] = Read();
T[0] = 0;
for(int i = 1; i <= n; i++)
for(int j = 0; j < i; j++)
if(T[i] > T[j])
Dp_UP[i] = max(Dp_UP[i] , Dp_UP[j]+1);
T[n + 1] = 0;
for(int i = n; i > 0; i--)
for(int j = n + 1; j > i; j--)
if(T[i] > T[j])
Dp_DOWN[i] = max(Dp_DOWN[i] , Dp_DOWN[j] + 1);
for(int i = 1; i <= n; i++)
Ans = max(Dp_UP[i] + Dp_DOWN[i] - 1, Ans);
Write(n - Ans);
return 0;
}

P1091 [NOIP2004 提高组] 合唱队形的更多相关文章

  1. 【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]

    以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队 ...

  2. 洛谷P1091 [NOIP2004 提高组] 合唱队形

    本题是一个简单的 LIS(最长上升子序列)问题     只是要求俩次最长上子序列而已   很容易的 首先由于是最长上升子序列 所以朴素法的动态规划表达式为  f[i] = max( f[i] , f[ ...

  3. [NOIP2004] 提高组 洛谷P1092 虫食算

    题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...

  4. [NOIP2004] 提高组 洛谷P1091 合唱队形

    题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2, ...

  5. noip2004提高组题解

    这次有两道题以前已经做过了,所以分数什么的也没有意义了.发现这年的难度设置极不靠谱,前三题都比较简单,最后一题太难,不知道出题人怎么想的. 第一题:储蓄计划 模拟. 第二题:合并果子 贪心.每次选最小 ...

  6. 洛谷 1091 合唱队形(NOIp2004提高组)

    [题解] 分别做一遍最长上升序列和最长下降序列,再枚举峰的位置计算答案即可. #include<cstdio> #include<algorithm> #include< ...

  7. 【NOIp2004提高组】食虫算 题解

    所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 + 8468#6633 44445509678 其中#号代表被 ...

  8. [NOIP2004] 提高组 洛谷P1090 合并果子

    题目描述 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可 ...

  9. [NOIP2004] 提高组 洛谷P1089 津津的储蓄计划

    题目描述 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄,妈妈提出,津津可以随时把整百的钱存在她那里 ...

随机推荐

  1. Listview滑动时不加载数据,停下来时加载数据,让App更优

    http://blog.csdn.net/yy1300326388/article/details/45153813

  2. 【js】Leetcode每日一题-解码异或后数组

    [js]Leetcode每日一题-解码异或后数组 [题目描述] 未知 整数数组 arr 由 n 个非负整数组成. 经编码后变为长度为 n - 1 的另一个整数数组 encoded ,其中 encode ...

  3. 第四部分 数据搜索之使用HBASE的API实现条件查询

    因为数据清洗部分需要用到Mapreduce,所以先解决hbase的问题,可以用命令先在hbase存一下简单的数据进行查询,之后只要替换数据就可以实现了原本功能 在看该部分前,确保Hase API看了, ...

  4. XGBoost原理解析

    摘要:对xgboost论文中的细节进行记录. 算法原理 系统设计 基于column block的并行 树学习最耗时的部分通常是对数据进行排序,为了降低排序带来的计算负荷,xgb使用基于block的结构 ...

  5. 序列化-Hessian

    引用官网介绍: Hessian is a dynamically-typed, binary serialization and Web Services protocol designed for ...

  6. Django(18)聚合函数

    前言 orm模型中的聚合函数跟MySQL中的聚合函数作用是一致的,也有像Sum.Avg.Count.Max.Min,接下来我们逐个介绍 聚合函数 所有的聚合函数都是放在django.db.models ...

  7. 删除所有空白列 cat yum.log | awk '{$1=$2=$3=$4=null;print $0}'>>yum.log1 sed ‘s/[ \t]*$//g' 删除所有空格 sed -i s/[[:space:]]//g yum.log

    2.删除行末空格 代码如下: 删除所有空白列 cat yum.log | awk '{$1=$2=$3=$4=null;print $0}'>>yum.log1 sed 's/[ \t]* ...

  8. 使用UltraISO制作ubuntu安装u盘启动盘图文教程

    使用UltraISO制作ubuntu安装u盘启动盘图文教程 胖先森关注 0.9572017.09.07 11:06:15字数 770阅读 27,901   制作U盘启动1.gif 1.首先打开Ultr ...

  9. rpm命令的简介(2)-(转自 青春乐园 )

    青春乐园 怎样查看rpm安装包的安装路径 rpm -qpl xxxxxx.rpm 1.如何安装rpm软件包 rmp软件包的安装可以使用程序rpm来完成.执行下面的命令 rpm -i your-pack ...

  10. redis 处理缓存穿透

    1. 缓存穿透简述 举例说明,redis中确实没有key值为"redis"数据,并且数据库里面也没有,那么每一次都会穿过缓存层,会将请求打到数据库查询,然后数据库进行查询,造成了不 ...