JZOJsenior1168.【NOIP动态规划专题】合唱队形
来源:互联网 发布:ubuntu 双系统 主分区 编辑:程序博客网 时间:2024/05/16 06:20
problem
Description
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。 合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1, 2, …, K,他们的身高分别为T1, T2, …, TK,则他们的身高满足T1 < T2 < … < Ti , Ti > Ti+1 > … > TK (1 <= i <= K)。 你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
Input
输入文件的第一行是一个整数N(2 <= N <= 100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130 <= Ti <= 230)是第i位同学的身高(厘米)。
Output
输出文件包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
Sample Input
8 186 186 150 200 160 130 197 220
Sample Output
4
Data Constraint
对于50%的数据,保证有n <= 20; 对于全部的数据,保证有n <= 100。
analysis
一道NOIP的经典题目,DP解决
开两个数组b[i]和c[i],分别表示到1~i的最长上升子序列和i~n的最长下降子序列的长度
DP两次,那么ans[i]就等于
最终答案即为max(ans[i])
code
#include<cstdio>using namespace std;int a[101],b[101],c[101];int n;int max(int x,int y){ return x>y?x:y;}int main(){ scanf("%d",&n); for (int i=1;i<=n;i++) { scanf("%d",&a[i]); } for (int i=1;i<=n;i++) { b[i]=1; for (int j=1;j<i;j++) { if (a[i]>a[j] && b[j]+1>b[i])b[i]=b[j]+1; } } for (int i=n;i>=1;i--) { c[i]=1; for (int j=i+1;j<=n;j++) { if (a[i]>a[j] && c[j]+1>c[i])c[i]=c[j]+1; } } int ans=0; for (int i=1;i<=n;i++) { ans=max(ans,b[i]+c[i]); } printf("%d\n",n-ans+1); return 0;}
阅读全文
0 0
- JZOJsenior1168.【NOIP动态规划专题】合唱队形
- 合唱队形 动态规划
- 合唱队形-动态规划
- 动态规划--合唱队形
- 动态规划:合唱队形
- 合唱队形 动态规划
- 洛谷 P1091 NOIP 2004 合唱队形(动态规划)
- 动态规划试题:合唱队形
- 合唱队形(动态规划)
- 动态规划3:合唱队形
- [NOIP2004]合唱队形【动态规划】
- 合唱队形(LIS) 动态规划
- 合唱队形(动态规划)
- 【NOIP·TG2004】caioj1065·动态规划入门(一维一边推3:合唱队形)
- 动态规划__合唱队形问题
- 动态规划---合唱队形(LIS问题)
- 动态规划__合唱队形问题
- 动态规划__合唱队形问题
- 第二章 SQL命令参考-ALTER DATABASE
- 【BZOJ3995】【SDOI2015】道路修建
- [BZOJ2426][HAOI2010] 工厂选址 (神奇的贪心)
- [bzoj-4808]马 题解
- 遇到的保存网页的问题
- JZOJsenior1168.【NOIP动态规划专题】合唱队形
- bzoj2794 [Poi2012]Cloakroom ( 背包DP+离线 )
- luogu 1057 传球游戏
- 第9章 中断和动态时钟显示
- 例题6-3 矩阵链乘 UVA442
- Android ADB emulator-5554 unauthorized
- C#入门--多态(二)
- noip2006 day1 t1 能量项链
- 0【NOIP2013初赛】整除 1铺砖问题 2【NOIP2012初赛】新壳栈 3【NOIP2013初赛】青蛙