首页 > 其他 > 详细

导弹拦截

时间:2018-08-02 22:35:26      阅读:184      评论:0      收藏:0      [点我收藏+]

LIS 用二分可以O(nlogn)

Dilworth定理,大概就是一个序列的不下降子序列的最小数量等于这个序列的最长上升子序列的长度

感性理解

赵宗昌老师讲了向前和向后求最长上升子序列的方法,又理解了动归

#include<iostream> 
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=1e5+7;
int a[maxn],n,f[maxn],l,r,mid;
int main(){
    while(cin>>a[++n]);n--;
    int ans1=0;
    f[0]=2147483647;
    for(int i=1;i<=n;i++){
        if(f[ans1]>=a[i]){
            f[ans1+1]=a[i];
            ans1++;
        }
        else{
            int l=0;r=ans1;
            while(l<r){
                mid=(l+r)/2;
                if(f[mid]>=a[i]) l=mid+1;
                else r=mid;
            }if(l!=0) f[l]=a[i];
        }
        
    }
    cout<<ans1<<endl;
    memset(f,-1,sizeof(f));
    int ans2=0;
    for(int i=1;i<=n;i++){
        if(f[ans2]<a[i]){
            f[ans2+1]=a[i];
            ans2++;
        }
        else{
            l=0;r=ans2;
            while(l<r){
                mid=(l+r)/2;
                if(f[mid]>=a[i]) r=mid;
                else l=mid+1;
            }
            f[l]=a[i];
        }
    } 
    cout<<ans2<<endl; 
    return 0;
}     

 

导弹拦截

原文:https://www.cnblogs.com/lcan/p/9409844.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!