zoukankan      html  css  js  c++  java
  • LIS,最长递增(或不下降)子序列,O(nlog(n))解法

    提交例题: http://acm.hdu.edu.cn/showproblem.php?pid=1950

    参考博客:http://blog.csdn.net/shuangde800/article/details/7474903

    代码。。。

     1 #include <iostream>
     2 #include <cstring>
     3 #include <cstdio>
     4 using namespace std;
     5 int dp[40002];///dp[i],最长序列长度为i的末位数字,该数字越小越好
     6 void input(int x, int index)//二分插入,(插入数字,长度不变,只改变一个位置的值。。,用二分)
     7 {
     8     int L = 1, R = index;
     9     while(R - L > 0)
    10     {
    11         int mid = L + (R - L) / 2;
    12         if(dp[mid] <= x) L = mid + 1;///注意边界,此循环是要找到大于x的第一个数字,并用x替代,所以剩下的数组不用包含与x相同的数字
    13         else R = mid;
    14     }
    15     dp[L] = x;
    16     return;
    17 }
    18 int main()
    19 {
    20     int t;
    21     cin >> t;
    22     while(t--)
    23     {
    24         int n;
    25         cin >> n;
    26         int ans = 0;//最长长度
    27         memset(dp, 0, sizeof(dp));
    28         for(int i = 0; i < n; i++)
    29         {
    30             int x;
    31             cin >> x;
    32             if(!i || x > dp[ans])
    33                 dp[++ans] = x;
    34             else input(x, ans);
    35         }
    36         cout << ans << endl;
    37     }
    38 
    39 }
    print “ 欢迎来到渣小狼的博客,这既是博客,也是日记,里面记录了小狼的学习经历还有一些小狼的见解,非常希望每一个来到这里的人能够留下只言片语,更加的希望留下的是对于小狼的不足的补充,谢谢(*^__^*) 嘻嘻……”
  • 相关阅读:
    Python之数学(math)和随机数(random)
    《图解HTTP》读书笔记
    leetcode1008
    leetcode1007
    leetcode1006
    leetcode1005
    leetcode218
    leetcode212
    leetcode149
    leetcode140
  • 原文地址:https://www.cnblogs.com/wolf-yasen/p/6656897.html
Copyright © 2011-2022 走看看