对于1D/1D动态规划来说,理论时间复杂度都是O(n^2)的,这种动态规划一般都可以进行优化,贴一篇文章
https://wenku.baidu.com/view/e317b1020740be1e650e9a12.html
这里介绍最简单的一种,LIS的求法
其实就是二分,找单调性来二分
HDU1950是一道裸题
1 #include <iostream> 2 #include<cstring> 3 #include <algorithm> 4 #define INF 0x3f3f3f3f 5 using namespace std; 6 const int N = 1e5 + 5; 7 int s[N]; 8 int n,p,a[N]; 9 int len; 10 int main() 11 { 12 cin>>n; 13 while(n--){ 14 cin>>p; 15 memset(s,0,sizeof(s)); 16 for(int i = 0;i<p;i++)cin>>a[i]; 17 s[1] = a[0];len = 1;//长度从1开始 18 for(int i = 1;i<p;i++){ 19 20 int t = a[i]; 21 if(t>s[len])s[++len] = a[i]; 22 else{ 23 /*************/int l = 1,r = len,mid;//这里的二分法采用了左闭右闭的思路 24 <span style="white-space:pre"> </span>int ans = 0; 25 while(l<=r) 26 { 27 mid = (l+r)/2; 28 if(s[mid]<t) 29 {l = mid +1;ans = max(ans,mid);}//ans即为思路中的j,j必然为s数组中小于t的最大的数 30 else r = mid-1; 31 } 32 s[ans+1] = t;/******************/ 33 } 34 } 35 //for(int i = 1;i<p;i++){cout<<s[i];}//有必要可以打开看看s中存的是什么值 36 cout<<len<<endl; 37 } 38 return 0; 39 }
然后
1 int p = lower_bound(s+1,s+len+1,t)-s; 2 s[p] = t;
如果觉得不对可以找到合唱队形那个题的程序对拍一下子