• 博客园logo
  • 会员
  • 周边
  • 新闻
  • 博问
  • 闪存
  • 众包
  • 赞助商
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
mengxm
博客园    首页    新随笔    联系   管理    订阅  订阅

poj1836

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

#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;
}

  

posted @ 2012-02-07 02:26  mengxm  阅读(371)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2026
浙公网安备 33010602011771号 浙ICP备2021040463号-3