最长单调子序列,看清题意,从左边求上升,从右边求下降,然后相加,注意中间两个点的高度可以相同(练手)

#include <stdio.h>
#include <string.h>
#define max(a,b) ((a)>(b)?true:false)
double a[1001];
int l[1001],h[1001],s[1001];
int n;
int main()
{
    while(scanf("%d",&n)==1)
    {
        memset(l,0,sizeof(l));
        memset(h,0,sizeof(h));
        for(int i=0;i<n;++i)
            scanf("%lf",&a[i]);
        for(int i=0;i<n;++i)
        {
            for(int j=0;j<i;++j)
                if(a[j]<a[i]&&max(l[j],l[i]))
                    l[i]=l[j];
            ++l[i];
        }
        for(int i=n-1;i>=0;--i)
        {
            for(int j=n-1;j>i;--j)
                if(a[j]<a[i]&&max(h[j],h[i]))
                    h[i]=h[j];
            ++h[i];
        }
        int max=0;
        for(int i=0;i<n;++i)
        {
            s[i]=l[i]+h[i]-1;
            for(int j=i+1;j<n;++j)
                if(a[i]==a[j])
                {
                    if(s[i]<(l[i]+h[j]))
                        s[i]=l[i]+h[j];
                    else
                        break;
                }
            if(max<s[i]) max=s[i];
        }
        printf("%d\n",n-max);
    }
    return 0;
}

  

相关文章:

猜你喜欢
  • 2021-07-24
  • 2022-12-23
  • 2022-12-23
  • 2021-05-20
  • 2022-02-01
相关资源
相似解决方案