zoukankan      html  css  js  c++  java
  • POJ 1631 Bridging signals (LIS:最长上升子序列)

    题意:给你一个长为n(n<=40000)的整数序列, 要你求出该序列的最长上升子序列LIS.

    思路:要求(nlogn)解法

    令g[i]==x表示当前遍历到的长度为i的所有最长上升子序列中的最小序列末尾值为x.(如果到目前为止, 根本不存在长i的上升序列, 那么x==INF无穷大)

    假设当前遍历到了第j个值即a[j], 那么先找到g[n]数组的值a[j]的下确界k(即第一个>=a[j]值的g[k]的k值). 那么此时表明存在长度为k-1的最长上升子序列且该序列末尾的位置<j且该序列末尾值<a[j].

    如果g[k-1] < a[j] < = g[k], update g[k], 那么可以令g[k]=a[j], 最后不断记录最长的k就好了

    #include<cstdio>  
    #include<cstring>  
    #include<algorithm>  
    #define INF 1e8  
    using namespace std;  
    const int maxn=40000+5;  
      
    int n;  
    int a[maxn];   
    int g[maxn];  
      
    int main()  
    {  
        int T; scanf("%d",&T);  
        while(T--)  
        {  
            scanf("%d",&n);  
            for(int i=1;i<=n;i++)  
            {  
                scanf("%d",&a[i]);  
                g[i]=INF;  
            }  
      
            int ans=0;  
            for(int i=1;i<=n;i++)  
            {  
                int k=lower_bound(g+1,g+n+1,a[i])-g;   
                g[k]=a[i];  
                ans=max(ans,k);  
            }  
      
            printf("%d
    ",ans);  
        }  
        return 0;  
    }
  • 相关阅读:
    L2-011 玩转二叉树 二叉树
    L2-010 排座位 并查集
    L2-009 抢红包
    VS 编译报错:意外的字符
    关于js的类型转换
    github相关操作总结
    关于时间的相关处理
    uniapp实现简单的动画效果(不使用dom操作)
    uniapp选择日期
    vue使用音频组件
  • 原文地址:https://www.cnblogs.com/demian/p/7372487.html
Copyright © 2011-2022 走看看