洛谷p1092合唱队形

来源:互联网 发布:ubuntu 安装terminal 编辑:程序博客网 时间:2024/06/05 06:04

原题

如果有人不知道最长上升子序列请先去看它。

题意就是要找中间高,两边矮的队伍,因为可以踢人,所以所求队形不一定在原序列中连续

就联想到最长上升子序列,从前面求最长上升子序列g[ ],从后面求最长上升子序列f[ ]

每一个值的两方子序列都求出来了,根据题意,找到一个最大的点max(f[]+g[]);

#include<iostream>#include<iomanip>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>using namespace std;int n,a[101],up[101],d[101];int main(){    cin>>n;    for(int i=1;i<=n;++i)    {        cin>>a[i];        up[i]=1;d[i]=1;    }    for(int i=2;i<=n;++i)    {        int l=0;        for(int j=1;j<=i-1;++j)            if(a[j]<a[i]&&up[j]>l)                l=up[j];        up[i]=l+1;    }    for(int i=n-1;i>=1;--i)     {         int l=0;         for(int j=i+1;j<=n;++j)     {                  if(a[i]>a[j]&&d[j]>l)         l=d[j];     }         d[i]=l+1;     }    int ans=0;    for(int i=1;i<=n;++i)    if(up[i]+d[i]>ans) ans=up[i]+d[i];    cout<<n-(ans-1);    return 0;}

原创粉丝点击