码迷,mamicode.com
首页 > 其他好文 > 详细

lis最长上升子序列

时间:2018-08-25 11:49:13      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:最小   printf   amp   pac   algorithm   names   find   改变   scanf   

因为是最长上升的,可以用一个数组储存上升的序列,如果后一个数字比数组的最大数字还大,就加到末尾去,如果不大于,那么就可以把这个数组中比他大的数字替换掉,因为如果数字更小,后面上升序列更长的可能性更大,这样也不会改变之前最大的数字;最小同理

#include<iostream>
#include<cstdio>
#include<algorithm>
#define sf scanf
#define pf printf
#define rep(i,a,b) for(int i=a;i<b;i++)
#define per(i,a,b) for(int i=a;i>=b;i--)
using namespace std;
int a[100005];
int low[100005];
int h[100005];
int find(int le,int x)
{
    int l=1,r=le,mid;
    while(r>l)
    {
        mid=(l+r)/2;
        if(x>=h[mid])
        r=mid;
        else
        l=mid+1;
    }
    return l;
}
int main()
{
    int n,ans=1;
    sf("%d",&n);
    rep(i,1,n+1)
    sf("%d",&a[i]);
//  low[1]=a[1];//上升的 
//  rep(i,2,n+1)
//  {
//      if(low[ans]<a[i])
//      low[++ans]=a[i];
//      else
//      {
//          int j=lower_bound(low+1,low+ans+1,a[i])-low;
//          low[j]=a[i];
//      }
//  }
    int ans1=1;//下降的 
    h[1]=a[1];
    rep(i,2,n+1)
    {
        if(h[ans1]>a[i])
        h[++ans1]=a[i];
        else
        {
            int j=find(ans1,a[i]);
            h[j]=a[i];
        }
    }
    pf("%d\n",ans1);
    return 0;
}

lis最长上升子序列

标签:最小   printf   amp   pac   algorithm   names   find   改变   scanf   

原文地址:https://www.cnblogs.com/wzl19981116/p/9532915.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!