給你乙個長度為n的整數序列,按從左往右的順序選擇盡量多的數字並且滿足這些數字不下降。
樸素dp演算法:f[i]表示到第i位為止的最長不下降子串行長度
f[i]=max(f[j])+1 (j為1~(i-1)個數中小於a[i]的數)
時間複雜度:o(n2)
考慮維護乙個佇列g,用g[i]表示長度為i的最長不下降子串行結尾的最小值。根據g[i]的單調性,可以用二分查詢的方法快速找到以當前數a[i]結尾的最長不下降子串行
#include
#include
#define fa(i,s,t) for(int i=s;i<=t;i++)
#define fd(i,s,t) for(int i=s;i>=t;i--)
using
namespace
std;
int n;
int num[10000];
int g[10000],f[10000];
void insert(int x,int s,int t) //不使用遞迴的方法提高效率
if(g[mid]>x) right=mid-1;
if(g[mid]if(g[mid+1]>x)
left=mid+1;}}
}int main()
memset(g,0,sizeof(g));
int t=1;
fa(i,1,n)
else
}int ans=t-1;
printf("%d\n",ans);
return
0;}
DP 最長不下降子串行 LIS
同類的問題還有 最長上公升子串行 最長下降子串行 他們的不同就在於定義的core規則不同,有的是 有的是 有的是 由此啟發,我們可以在解決其他的問題,不一定是比較數的大小的問題裡面抽象出這種模型.下面介紹這種動態規劃入門都會介紹的問題的思路.首先我們從頭開始分析這個問題.對這個序列中的每乙個數的 有...
最長不下降子串行問題
前幾天看了關於動態規劃的內容,基本上講的都是最大不下降序列,所以第一次部落格 就寫這個東西了。給出一系列的數,給出乙個整數,即最長不下降子串行 code vs 1567 題解 先另創乙個陣列,用來記錄某乙個數到目前為止的最大長度,用for語句將所有元素遍歷 一遍就可以確定最長不下降子串行的長度了。比...
最長不下降子串行問題
第一問 lis 求出 s 用正常的 o n 2 的演算法,後面有用 第二問首先動態規劃求出 f i 然後根據題意 最多可取出多少個長度為s的不下降子串行 說明子串行的起點一定在 i 當且僅當 f i s 終點在 j 當且僅當 f j 1 又因為這是網路流24題每個數只能被選一次,所以把每個數對應到點...