• hdu 5489(LIS最长上升子序列)


    题意:一个含有n个元素的数组,删去k个连续数后,最长上升子序列        /*思路参考GoZy

    思路: 4 2 3 [5 7 8] 9 11 ,括号表示要删掉的数,

    所以  最长上升子序列  =   ] 右边数A的lis + [左边最大值小于A的lis 

    即相当于枚举删除的所有情况,并求它们的LIS,取最大值

    如本例 : 最长 = 2[ 9 11]  + 2[2 3],  然后将框从左往右移,算出最大值


    用nlog(n)求LIS:

    对于a[i],在arr数组中用log(n)找到比它小的数的个数x,arr[x] = a[i] ,arr保存的到当前位置的最长LIS


    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #include <functional>
    #include <vector>
    #include <queue>
    #define MAXN 100010
    typedef long long ll;
    using namespace std;
    
    const int N = 1e5 + 5;
    int a[N];
    int b[N];
    int d1[N];      //表示i处的LIS
    int arr[N];
    
    int main()
    {
        int t,cas = 1;
        int n,len;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&len);
            for(int i = 0; i <= n-1; i++)
            {
                scanf("%d",&a[i]);
                b[i] = -a[i];            //为求右边的LIS
            }
    
            memset(arr,0x3f3f3f,sizeof(arr));
            for(int i = n-1; i >= 0; i--)   //nlog(n)求LIS
            {
                int x = lower_bound(arr,arr+n,b[i]) - arr;   //用log(n)查找,也可二分
                arr[x] = b[i];                               
                d1[i] = x+1;
            }
    
            int ans = 0,tlen = 0;
            memset(arr,0x3f3f3f,sizeof(arr));
            for(int i = len; i < n; i++)                        //arr中保存框左边的数最长lis
            {
                int x = lower_bound(arr,arr+n,a[i]) - arr;     //在前面找最大值比a[i]小的最长LIS
                ans = max(ans,x + d1[i]);
                x = lower_bound(arr,arr+n,a[i - len]) - arr;    
                arr[x] =  a[i - len];
                tlen = max(x+1,tlen);                           //记录左边的最长长度
            }
            printf("Case #%d: ", cas++);
            ans = max(ans,tlen);                                //比较全在框左边的情况
            printf("%d
    ",ans);
        }
        return 0;
    }
    

      

    ps.如果没有东西值得你为之努力,那你和一条咸鱼有什么区别? 

  • 相关阅读:
    分布式框架服务调用超时设计与实现
    分布式框架灰度发布实现
    写给自己的 SOA 和 RPC 理解
    Java 基础【19】代理
    Java 基础【18】 反射与内省
    Spring HttpInvoker 从实战到源码追溯
    Lombok 使用攻略
    Guava Preconditions 工具参数前置校验
    CAS 单点登录【2】自定义用户验证
    Hibernate 离线对象构建通用查询
  • 原文地址:https://www.cnblogs.com/Przz/p/5409740.html
Copyright © 2020-2023  润新知