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 }

 

posted on 2017-04-01 17:28  子狼  阅读(645)  评论(2编辑  收藏  举报

导航