洛谷P1091 合唱队形

来源:互联网 发布:知乎二战德国石油 编辑:程序博客网 时间:2024/06/05 10:40

题目描述

N位同学站成一排,音乐老师要请其中的(NK)位同学出列,使得剩下的K位同学排成合唱队形。

K12KT1T2TKT1<...<Ti>Ti+1>>TK(1<=i<=K)

你的任务是,已知所有N位同学的身高,计算最少需要几位同学出列,可以使得剩下的同学排成合唱队形。

输入输出格式
输入格式:

输入文件chorus.in的第一行是一个整数N(2<=N<=100),表示同学的总数。第一行有n个整数,用空格分隔,第i个整数Ti(130<=Ti<=230)是第i位同学的身高(厘米)。

输出格式:

输出文件chorus.out包括一行,这一行只包含一个整数,就是最少需要几位同学出列。

输入输出样例
输入样例#1:

8
186 186 150 200 160 130 197 220

输出样例#1:

4

说明

对于50%的数据,保证有n<=20;

对于全部的数据,保证有n<=100。


如果不是看了题解,我恐怕是很难想出来的。。。
其实就是一个正向的最长上升子序列和反向的最长上升自序列,我们枚举每个i求出max(f[i]+d[i])就是最长的合唱队列,我们用总人数与其相减即可

#include <iostream>using namespace std;const int maxn=105;int n,ans,a[maxn],f[maxn],d[maxn];int main(){    cin>>n;    for(int i=1;i<=n;i++)        cin>>a[i];    for(int i=1;i<=n;i++)     for(int j=1;j<i;j++)      if(a[i]>a[j])f[i]=max(f[i],f[j]+1);    for(int i=n;i>=1;i--)     for(int j=n;j>i;j--)      if(a[i]>a[j])d[i]=max(d[i],d[j]+1);    for(int i=1;i<=n;i++)        ans=max(ans,d[i]+f[i]);    cout<<n-ans-1<<endl;    return 0;}
原创粉丝点击