【NOIP2004】合唱队形题解
来源:互联网 发布:关闭数据还用流量 编辑:程序博客网 时间:2024/04/29 22:50
题面
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
题解
分析
题目要求很像最长上升子序列,因此可以用类似的方法:
用f(i)记录1~i的最长上升子序列
用g(i)记录i~n的最长下降子序列
那么
AC!!!
代码
# include<iostream># include<cstdio>using namespace std;int a[1001],f[1001],g[1001],n,ans;void init(){ int i; freopen("chorus.in","r",stdin); scanf("%d",&n); for (i=1;i<=n;i++) scanf("%d",&a[i]);}void dp(){ int i,j; f[1]=1; for (i=2;i<=n;i++) { f[i]=0; for (j=1;j<=i-1;j++) if ((a[j]<a[i])&&(f[j]>f[i])) f[i]=f[j]; f[i]+=1; } g[n]=1; for (i=n-1;i>=1;i--) { g[i]=0; for (j=i+1;j<=n;j++) if ((a[j]<a[i])&&(g[j]>g[i])) g[i]=g[j]; g[i]+=1; } ans=0; for (i=1;i<=n;i++) if (f[i]+g[i]-1>ans) ans=f[i]+g[i]-1;}void print(){ freopen("chorus.out","w",stdout); printf("%d",n-ans);}int main(){ init(); dp(); print();}
冰冻三尺,非一日之寒
0 0
- 【NOIP2004】合唱队形题解
- P1091 合唱队形题解NOIP2004
- NOIP2004 合唱队形
- [DP][NOIP2004] 合唱队形
- 【NOIP2004】合唱队形
- NOIP2004 合唱队形
- 合唱队形 noip2004 vijosp1098
- noip2004(提高组) 合唱队形
- [NOIP2004]合唱队形【动态规划】
- noip2004合唱队形2008.11.4
- Noip04合唱队形题解
- luoguP1091 合唱队形 题解
- ACM 109. [NOIP2004] 合唱队形(dp+枚举)
- |Tyvj|NOIP2004|动态规划|P1067 合唱队形
- Vijos P1098 合唱队形题解
- [题解]vijos 1098 合唱队形
- 【最长上升子序列】[NOIP2004提高组]合唱队形
- [线性DP]合唱队形(NOIP2004)(LIS的简单应用)
- 【练习笔记】剑指offer-面试题3 :二维数组中的查找
- 线程间的通信(生产者与消费者)
- UVA107等比数列注意特判
- DRP问题系列——The Network Adapter could not establish the connection
- 新媒体“4U”理论
- 【NOIP2004】合唱队形题解
- checkBox多选支付列表的实现(可以跨屏幕实现多选并计算金额)
- Bundle savedInstanceState的作用
- 【Swift】学习笔记(七)——闭包
- Android开发中 ic_launcher 尺寸
- Model,gcc的__sync_synchronize要慎用。
- linux 遍历打印目录树
- 推荐:互联网思维必读十本书
- hibernate缓存机制