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 “ 欢迎来到渣小狼的博客,这既是博客,也是日记,里面记录了小狼的学习经历还有一些小狼的见解,非常希望每一个来到这里的人能够留下只言片语,更加的希望留下的是对于小狼的不足的补充,谢谢(*^__^*) 嘻嘻……”