二分求最长上升子序列

来源:互联网 发布:企业qq for mac版 编辑:程序博客网 时间:2024/06/05 08:19

简述

我们知道N2求最长上升子序列的方法,即

f[i]=max(f[i],f[j]+1)(j=1 i1,f[i]>f[j])

然而,我们可以用二分求最长上升子序列。
由于我们知道子序列c,c[1]<c[2]<… <c[n]。
所以我们二分出一个位置t,将c[t]的值更新为a[i]。
如果t>ans,证明最长上升子序列的长度可以+1,于是ans++。

代码

#include<iostream>#include<cstdio>#include<cmath>#define N 100010#define fo(i,a,b) for(i=a;i<=b;i++)using namespace std;int i,j,l,n,m,t,s,ans;int a[N],c[N];char ch;int ef(int l,int r,int x){    if (l==r) return l;    int mid=(l+r)/2;    if (x>c[mid]) return ef(mid+1,r,x);else return ef(l,mid,x);}int main(){    scanf("%d",&n);    fo(i,1,n) scanf("%d",&a[i]);    c[0]=-2147483647;    ans=0;    fo(i,1,n)    {        j=ef(1,ans+1,a[i]);        c[j]=a[i];        if (j==ans+1) ans++;    }    printf("%d",ans); }
2 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 手机总黑屏退出怎么办 宇飞来手机死机怎么办 宇飞来忘记密码怎么办 手机总卡死机怎么办 手机经常死机怎么办啊 手机卡到动不了怎么办 三星手机卡住了怎么办 手机突然动不了怎么办 苹果手机密码锁死了怎么办 节目指南无响应怎么办 电信卡网速不好怎么办 网上有人黑我怎么办? 公司前台没事做怎么办 股票跌到谷底了怎么办 cad无法进一步缩小怎么办 dnf更新错误280怎么办 win7电脑屏幕倒过来了怎么办 电脑画面缩小了怎么办 每次客户不付款怎么办 如果客户不付款怎么办 支付宝逾期起诉怎么办 卖号被骗了怎么办 网上交易视频被骗了怎么办 闲鱼卖游戏账号被骗怎么办 网银锁住了怎么办 电脑密码锁住了怎么办 苹果x旋转不了怎么办 苹果x黑白屏怎么办 dell网卡坏了怎么办 笔记本连网速慢怎么办 无线充电太慢怎么办 vivo手机速度慢怎么办 台式电脑很卡怎么办 电脑网卡驱动程序不正常怎么办 电脑没有网卡驱动怎么办 电脑网络网速差怎么办 小米wifi测速慢怎么办 电脑网速特别慢怎么办 戴尔电脑网速慢怎么办 电脑网络特别慢怎么办? 电脑上网很慢怎么办