洛谷 1091 合唱队形
来源:互联网 发布:乌鲁木齐网络蛋糕店 编辑:程序博客网 时间:2024/05/29 17:23
题目描述
N位同学站成一排,音乐老师要请其中的(N-K)位同学出列,使得剩下的K位同学排成合唱队形。
合唱队形是指这样的一种队形:设K位同学从左到右依次编号为1,2…,K,他们的身高分别为T1,T2,…,TK, 则他们的身高满足T1<...<Ti>Ti+1>…>TK(1<=i<=K)。
你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。
输入输出格式
输入格式:
输入文件chorus.in的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。
输出格式:
输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。
看到这道题就想到了应该是最长上升子序列与最长下降子序列的和最长。接着分析算法复杂度,枚举中间人 *最大上升/下降子序列=100的3次方,刚好可以。
关于求最大上升子序列的方法就不必过多赘述,dp[i][j]表示前i个里的前j个的最长上升子序列,每次从比i小j个里面找到最大的dp[i][j]加1更新答案即可。
下附AC代码。
#include<iostream>#define maxn 105using namespace std;int dps[maxn][maxn];int dpx[maxn][maxn];int height[maxn];int lo[maxn];int n;int main(){cin>>n;for(int i=1;i<=n;i++)cin>>height[i];int ans=n;for(int k=1;k<=n;k++){for(int i=1;i<=k;i++){int m=0;for(int j=1;j<=i;j++){if(height[j]<height[i]){m=max(m,dps[k][j]);}}dps[k][i]=max(dps[k][i],m)+1;}int biggest=0;for(int i=k;i<=n;i++){int m=0;for(int j=k;j<=i;j++){if(height[j]>height[i]){m=max(dpx[k][j],m);}}dpx[k][i]=max(dpx[k][i],m)+1;biggest=max(biggest,dpx[k][i]);}lo[k]=biggest;ans=min(ans,n-lo[k]+1-dps[k][k]);}cout<<ans<<endl;}
阅读全文
0 0
- 合唱队形-洛谷 1091
- 洛谷 1091 合唱队形
- luogu 1091 合唱队形
- 洛谷 P1091 合唱队形
- 洛谷 P1091 合唱队形
- 洛谷 P1091 合唱队形
- 洛谷 P1091 合唱队形
- 洛谷P1091 合唱队形
- 洛谷p1092合唱队形
- 洛谷P1091合唱队形
- 洛谷 P1091 合唱队形
- 洛谷 U5874 合唱队形2
- 【DP】洛谷 P1091 合唱队形
- 洛谷 P1091 合唱队形 kevin_xcw
- 合唱队形
- 合唱队形
- 合唱队形
- 合唱队形
- 使用jQuery+JSONP获取跨域资源
- 原生JavaScript实现幻灯片效果
- 读书笔记-人月神话19
- 【JZOJ 3853】【NOIP2014八校联考第2场第2试9.28】帮助Bsny(help) (详解)
- 美团codeM预赛B 送外卖2
- 洛谷 1091 合唱队形
- Ubuntu16.04下PX4 开发环境配置
- oracle连接数据库配置信息
- 数据压缩实验六--MPEG音频编码
- 《linux命令行与shell脚本编程大全》第三版
- 3
- First Bad Version
- 初见蓝桥--历年试题 兰顿蚂蚁
- LightOJ