luogu 1091

正反做两次最长上升子序列。

记f[i]为正着做以Ti为结尾的最长上升子序列。

记g[i]为倒着做以Ti为结尾的最长上升子序列。

答案就是n-max(f[i]+g[i]-1)。

#include"cstdio"
#include"cctype"
#include"algorithm"
using namespace std;
int read()
{
    int c,x=0; while(!isdigit(c=getchar()));
    while(x=x*10+c-'0',isdigit(c=getchar()));
    return x;
}
int t[101],f[101],g[101];
int main()
{
    int n=read(),ans=0;
    for(int i=1; i<=n; i++)
    {
        t[i]=read();
        f[i]=1;
        for(int j=1; j<i; j++)
            if(t[i]>t[j]) f[i]=max(f[j]+1,f[i]);
    }
    for(int i=n; i>=1; i--)
    {
        g[i]=1;
        for(int j=n; j>i; j--)
            if(t[i]>t[j]) g[i]=max(g[j]+1,g[i]);
        ans=max(f[i]+g[i]-1,ans);
    }
    printf("%d",n-ans);
    return 0;
}

 

posted @ 2018-01-23 15:02  TrassBlose  阅读(81)  评论(0编辑  收藏  举报