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

导弹拦截

时间:2018-08-02 23:07:25      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:main   include   bsp   pre   序列   理解   一个   class   nlogn   

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

 

导弹拦截

标签:main   include   bsp   pre   序列   理解   一个   class   nlogn   

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

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