洛谷 P1091 合唱队形 kevin_xcw
来源:互联网 发布:淘宝怎么看买家的等级 编辑:程序博客网 时间:2024/05/20 19:28
洛谷 P1091 合唱队形
时空限制 1s / 128MB
【题目描述】
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<…Ti+1>…>TK(1<=i<=K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
【输入格式】
输入文件chorus.in的第一行是一个整数N(2<=N<=100),表示同学的总数。
第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。
【输出格式】
输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
【输入样例】
8
186 186 150 200 160 130 197 220
【输出样例】
4
【数据范围】
对于50%的数据,保证有n<=20;
对于全部的数据,保证有n<=100。
【解题报告】
本人觉得这题是很不错的,虽然难度不高。首先,我们要想出列最少,那么就想要留下的最多。很容易想的最长升,但是,这个序列是一个中间高,两头底的序列,最长升只能处理出单调性的序列。那么怎么做到呢?
我们先看从T1到Ti这一段单调递增的序列,再看Ti到TK这一段单调递减的序列,那么问题就解决了。先从1到n求一趟最长升,然后从n到1也求一趟,最后枚举中间的Ti,然后从众多Ti中挑个大的。
代码如下:
#include<cstdio>#include<algorithm>using namespace std;int n,a[105],f[2][105],ans;int main(){ scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); a[0]=0; for(int i=1;i<=n;i++)//从1到n求最长升 for(int j=0;j<i;j++) if(a[i]>a[j]) f[0][i]=max(f[0][i],f[0][j]+1); a[n+1]=0; for(int i=n;i;i--)//从n到1求最长升 for(int j=n+1;j>i;j--) if(a[i]>a[j]) f[1][i]=max(f[1][i],f[1][j]+1); for(int i=1;i<=n;i++) ans=max(f[0][i]+f[1][i]-1,ans);//枚举Ti,从1到Ti的最长升+从TK到Ti的最长升-1(Ti被加了两次) printf("%d\n",n-ans); return 0;}
阅读全文
0 0
- 洛谷 P1091 合唱队形 kevin_xcw
- 洛谷 P1091 合唱队形
- 洛谷 P1091 合唱队形
- 洛谷 P1091 合唱队形
- 洛谷 P1091 合唱队形
- 洛谷P1091 合唱队形
- 洛谷P1091合唱队形
- 洛谷 P1091 合唱队形
- 【DP】洛谷 P1091 合唱队形
- P1091 合唱队形
- P1091 合唱队形
- [P1091]合唱队形
- P1091 合唱队形
- P1091 合唱队形题解NOIP2004
- 洛谷 P1091 NOIP 2004 合唱队形(动态规划)
- 合唱队形-洛谷 1091
- 洛谷 1091 合唱队形
- 洛谷p1092合唱队形
- 简单的购物车
- 庖丁解牛之ScrollView
- 消息队列
- Tesseract-OCR引擎 入门
- Android Studio Git 更新指定目录
- 洛谷 P1091 合唱队形 kevin_xcw
- webview的使用
- 30分钟掌握ES6/ES2015核心内容(上)
- 自定义组合控件,无限轮播图效果
- 递归调用的理解
- 职工信息管理系统
- 仿京东详情页跳转到购物车
- Eclipse中Maven Module和Maven Project的区别
- JS截取与分割字符串substring()和substr()和slice()和split()和John()