1D/1D动态规划之LIS的O(nlogn)求法

对于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;

如果觉得不对可以找到合唱队形那个题的程序对拍一下子

猜你喜欢

转载自www.cnblogs.com/aininot260/p/9627043.html