动态规划:LIS优化
生活随笔
收集整理的這篇文章主要介紹了
动态规划:LIS优化
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
對于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;如果覺得不對可以找到合唱隊形那個題的程序對拍一下子
轉載于:https://www.cnblogs.com/aininot260/p/9627043.html
總結
以上是生活随笔為你收集整理的动态规划:LIS优化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据显示国产新能源汽车上半年出口53.4
- 下一篇: nowcoder172C 保护 (倍增l