vijos 1098 合唱队形 - 动态规划
描述
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
格式
输入格式
输入的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。
输出格式
输出包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
样例1
样例输入1
8
186 186 150 200 160 130 197 220
样例输出1
4
限制
每个测试点1s
来源
NOIP 2004
(转自https://vijos.org/p/1098)
一看还真不好处理,至于高度从小到大再从大到小就先分开来看,先把从左边开始的不下降子序列求出来,不如用个l数组
l[i]表示从到i这个点最长的不下降子序列的长度,再用个r数组,表示从右边到i这个点最长不下降子序列的长度(注意是从右到左),然后再拼起来(l[i] + r[i]),减去一个人(第i个人算重了)就是i这个人当做k时最大可以选用的人的数量。
这样的看得话就简单多了,求2次最长不下降子序列,再for循环跑一趟就把最大可以选用的人数算出来。注意,l,r数组的初值是1(1个
人也可以排成这样的序列)
Code
/*
* vijos.org
* Problem#1098
* Accepted
* Time:45ms
* Memory:556k
*/
#include<iostream>
#include<cstdio>
#include<cctype>
#include<cstring>
using namespace std;
template<typename T>
inline void readInteger(T& u){
char x;
while(!isdigit((x = getchar())));
for(u = x - '';isdigit((x = getchar()));u = ((u << ) + (u << ) + x - ''));
ungetc(x, stdin);
}
int n;
int *l,*r;
int *h;
void init(){
readInteger(n);
h = new int[(const int)(n + )];
l = new int[(const int)(n + )];
r = new int[(const int)(n + )];
for(int i = ;i <= n;i++){
readInteger(h[i]);
}
}
int result;
void solve(){
for(int i = ;i <= n; i++){
l[i] = r[n - i + ] = ;
for(int j = ;j < i; j++){
if(h[i] > h[j] && l[i] <= l[j])
l[i] = l[j] + ;
if(h[n - i + ] > h[n - j + ] && r[n - i + ] <= r[n - j + ])
r[n - i + ] = r[n - j + ] + ;
}
}
for(int i = ;i <= n;i++)
if(l[i] + r[i] > result) result = l[i] + r[i];
}
int main(){
init();
solve();
printf("%d",n - result + );
return ;
}
vijos 1098 合唱队形 - 动态规划的更多相关文章
- 九度OJ 1131 合唱队形 -- 动态规划(最长递增子序列)
题目地址:http://ac.jobdu.com/problem.php?pid=1131 题目描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合 ...
- Vijos:P1098合唱队形
描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…, ...
- P1091 合唱队形题解(洛谷,动态规划LIS,单调队列)
先上题目 P1091 合唱队形(点击打开题目) 题目解读: 1.由T1<...<Ti和Ti>Ti+1>…>TK可以看出这题涉及最长上升子序列和最长下降子序列 2 ...
- 【模板】LIS模板 洛谷P1091 [NOIP2004提高组]合唱队形 [2017年4月计划 动态规划11]
以题写模板. 写了两个:n^2版本与nlogn版本 P1091 合唱队形 题目描述 N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形. 合唱队形是指这样的一种队 ...
- NOIP200407合唱队形+最长上升子序列O(n^2)详解
合唱队形解题报告 2016-05-12 4:30——6:45 NOIP200407合唱队形 难度级别:A: 运行时间限制:1000ms: 运行空间限制:256000KB: 代码长度限制:20000 ...
- 洛谷 P1091 合唱队形
\[传送门在这里呀\] 题目描述 \(N\)位同学站成一排,音乐老师要请其中的\((N-K)\)位同学出列,使得剩下的\(K\)位同学排成合唱队形. 合唱队形是指这样的一种队形:设K位同学从左到右依次 ...
- 九度OJ 1131:合唱队形 (DP、最长上升下降序列)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:2865 解决:881 题目描述: N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学不交换位置就能排成合唱队形. ...
- NOIP 2004 合唱队形
洛谷 P1091 合唱队形 https://www.luogu.org/problemnew/show/P1091 JDOJ 1271: [NOIP2004]合唱队形 T3 https://neooj ...
- 【题解】合唱队形——LIS坑爹的二分优化
题目 [题目描述]N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形.合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1 ...
随机推荐
- PHP漏洞-Session劫持
http://os.51cto.com/art/201204/328888.htm
- Shell初学(三)传参
一. 脚本代码:test.sh echo "Shell 传递参数实例!"; echo "执行的文件名:$0"; echo "第一个参数为:$1&quo ...
- NYOJ 275 队花的烦恼一
队花的烦恼一 时间限制:3000 ms | 内存限制:65535 KB 难度:1 描写叙述 ACM队的队花C小+常常抱怨:"C语言中的格式输出中有十六.十.八进制输出,然而却没有二进制输 ...
- 类似CFS程式发布注意事项
1.CFS 此AP 程式的验证方式为Forms 验证.需要在IIS 中做如下设置(Forms 身份验证,配套的Web.config 中要有对应节点代码,后台代码中要有获取方式) 2.Forms 身份验 ...
- 004-redis-命令-哈希操作,列表操作
Redis hash 命令 下表列出了 redis hash 基本的相关命令: 序号 命令及描述 1 HDEL key field1 [field2] 删除一个或多个哈希表字段 2 HEXISTS k ...
- React Native开发之IDE(Atom+Nuclide)安装,运行,调试
版权声明:本文为博主原创文章,如需转载请注明出处 目录(?)[-] 前言 MacWindowsLinux 准备工作 安装Atom 安装Nuclide 新建一个工程 自动补全 类型标注 语法检查 跳 ...
- [py]py2自带Queue模块实现了3类队列
py2自带Queue实现了3类队列 先搞清楚几个单词 Queue模块实现了三类队列: FIFO(First In First Out,先进先出,默认为该队列), 我们平时泛指的队列, LIFO(Las ...
- Period(sdut2476)
[题目大意]:给定一个字符串,求到哪一位时的字串是前几位循环组成的,并求出循环次数. 思路:求每个前缀的最小循环周:从i到n枚举len,如果len%(len-next[len])==0,则这个前缀是由 ...
- http形式的webservice
import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import ...
- 按照用户名和角色查询用户liferay
需求:当登录的用户输入用户的名字和角色的时候,模糊查询,然后就是Ajax的异步请求刷新界面 首先在一个工具类中写上一条你要写的sql语句代码如下: package com.ebizwindow.crm ...