• 单调递增子序列LIS (DP)



    复杂度:O(nlogn)

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    
    
    const int MAXN=1005;
    int a[MAXN],b[MAXN];
    ///b[k]是序列a中所有长度为k的递增子序列中的最小结尾元素值
    ///用二分查找的方法找到一个位置,使得num>b[i-1]并且num<b[i],并用num代替b[i]
    int Search(int num,int low,int high){
        int mid;
        while(low<=high){
            mid=(low+high)/2;
            if(num>=b[mid])low=mid+1;
            else high=mid-1;
        }
        return low;
    }
    
    
    int DP(int n){
        int i,len,pos;
        b[1]=a[1];
        len=1;
        for(i=2;i<=n;i++){
            if(a[i]>b[len]){///如果a[i]比b[]数组中最大还大直接插入到后面即可
                len=len+1;
                b[len]=a[i];
            }
            else{///用二分的方法在b[]数组中找出第一个比a[i]大的位置并且让a[i]替代这个位置
                pos=Search(a[i],1,len);
                b[pos]=a[i];
            }
        }
        return len;
    }
    
    
    int main(){
        int N,i;
        while(~scanf("%d",&N)){
            for(i=1;i<=N;++i)
                scanf("%d",&a[i]);
            printf("%d
    ",DP(N));
        }
        return 0;
    }

    复杂度:O(n^2)

    #include<iostream>
    #include<stdio.h>
    using namespace std;
    #define MAXN 1005
    
    int a[MAXN];
    int dp[MAXN];///dp[i]表示以a[i]作为结尾的最长上升子序列的长度
    
    int main(){
        int N;
        while(~scanf("%d",&N)){
            for(int i=1;i<=N;++i)
                scanf("%d",&a[i]);
            dp[1]=1;
            for(int i=2;i<=N;++i){
                int temp=0;
                for(int j=1;j<i;++j){
                    if(a[i]>a[j]&&temp<dp[j])
                            temp=dp[j];
                }
                dp[i]=temp+1;
            }
            int res=0;
            for(int i=1;i<=N;++i)
                if(dp[i]>res)
                    res=dp[i];
            printf("%d
    ",res);
        }
        return 0;
    }
    




  • 相关阅读:
    flex space-between最后一行对齐问题的解决方案
    如何在父级下访问v-slot的值——vuejs
    flex下省略号的问题解决
    Typescript使用字符串联合类型代替枚举类型
    flex三个对齐属性的记忆方式
    JS中的slice()和splice()的区别以及记忆方式
    JS中的call,apply和bind及记忆方式
    Vue 还是 React 还是 Angular ?
    利用ES6的Promise.all实现至少请求多长时间
    .net core <environment> 不起作用
  • 原文地址:https://www.cnblogs.com/zswbky/p/6792916.html
Copyright © 2020-2023  润新知