合唱队列

                                                                 洛谷1091 合唱队列

   觉得自己就是个ZZ,打眼一看,没思路,一看数据,n<=100,这不会是大法师吧。。。于是打暴力,快一小时(加上30分钟下课~~哦,下课时和陈国凯聊了一会QQ%%%学神,mac)也没调出来,信心倍挫,然后放弃,看题解,哦cao,是最长上升子序列,然后秒掉了。。。。。。。。。

   先正着做一遍LIS,再倒着来一遍LIS,再枚举中间最高的人,正反求和,取最大,最后用n减去ans再减一,因为最高的人被算了两次。

 

#include<bits/stdc++.h>
using namespace std;
int n;
int a[101];
int fr[101],ba[101];
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])
            fr[i]=max(fr[i],fr[j]+1);
        }

    for(int i=n;i>=1;i--)
      for(int j=n;j>i;j--)
        {
            if(a[i]>a[j])
            ba[i]=max(ba[i],ba[j]+1);
        }    
        int ans=-1;
    for(int i=1;i<=n;i++)
    {
        ans=max(fr[i]+ba[i],ans);
    }
    cout<<n-ans-1;
    return 0;
}

 

posted @ 2017-08-05 17:44  WeiAR  阅读(402)  评论(0编辑  收藏  举报