提交例题: 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 }