洛谷 P1091 [NOIP2004 提高组] 合唱队形

题目链接

这题的思路是动态规划。

找到每个数以该数为结尾的最长上升子序列长度和以该数为开始的最长下降子序列的长度。

其中求以该数为开始的最长下降子序列的长度可以看做从最后一个数开始往前数,以该数为结尾的最长上升子序列的长度。

求最长上升子序列长度。令f[j]=max(f[j],f[k]+1).(k<j,h[k]<h[j])即可。

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
int n,h[105],maxn[105],minn[105],cnt; 
int main(){
    scanf("%d",&n);
    for(int i=0;i<n;i++)
        scanf("%d",&h[i]);
    for(int i=0;i<n;i++)
        maxn[i]=1,minn[i]=1;
    for(int i=0;i<n;i++)
        for(int j=0;j<i;j++){
            if(h[i]>h[j])
                maxn[i]=max(maxn[i],maxn[j]+1);
        }
    for(int i=n-1;i>=0;i--)
        for(int j=n-1;j>i;j--){
            if(h[i]>h[j])
                minn[i]=max(minn[i],minn[j]+1);
        }
    for(int i=0;i<n;i++)
        cnt=max(cnt,maxn[i]+minn[i]);
    printf("%d",n-cnt+1);
    return 0;
}

 

posted @ 2021-02-20 17:10  mikku  阅读(46)  评论(0)    收藏  举报