单调递增子序列(二) ---- 数据特大 , 需要优化
这个时间复杂度是 n*log n 有了很大的优化 , 并且用stl函数库中的 lower_bound 能简化代码 .
这个题用 平时的n^2 的代码的话 是铁定超时的 下面附上 140ms 的代码
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<iostream> 5 #include<algorithm> 6 #include<queue> 7 #include<vector> 8 #include<set> 9 #include<stack> 10 #include<string> 11 #include<sstream> 12 #include<map> 13 #include<cctype> 14 #include<limits.h> 15 using namespace std; 16 int main() 17 { 18 int n,b,dp[100005],location,num; 19 while(scanf("%d",&n)!=EOF) 20 { 21 num=0; 22 for(int i=0;i<n;i++) 23 { 24 scanf("%d",&b); 25 location=lower_bound(dp,dp+num,b)-dp; //在 已经有序的数组中二分查找 26 dp[location]=b; 27 num=location+1>num?location+1:num; 28 } 29 printf("%d\n",num); 30 } 31 return 0; 32 }