DP 最長不下降子串行問題(二分)

2021-07-04 17:05:51 字數 807 閱讀 6165

給你乙個長度為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題每個數只能被選一次,所以把每個數對應到點...