DP 水題 最長不下降子串行

2022-08-25 21:54:27 字數 642 閱讀 9946

給乙個陣列a1, a2 ... an,找到最長的不下降子串行ab1

<=ab2

<= .. <=abk,其中b1輸出長度即可。

第一行,乙個整數n。

第二行 ,n個整數(n < = 5000)

輸出k的極大值,即最長不下降子串行的長度

5

9 3 6 2 7

3

#include#includeusing namespace std;

int n,a[5010]= ,b[5010]= ,maxb=0;

int main()

for(int i=1; i<=n; i++)

for(int j=1; j=a[j]) b[i]=max(b[i],b[j]+1);

}for(int i=1; i<=n; i++)

printf("%d", maxb+1);

return 0;

}

DP 最長不下降子串行 LIS

同類的問題還有 最長上公升子串行 最長下降子串行 他們的不同就在於定義的core規則不同,有的是 有的是 有的是 由此啟發,我們可以在解決其他的問題,不一定是比較數的大小的問題裡面抽象出這種模型.下面介紹這種動態規劃入門都會介紹的問題的思路.首先我們從頭開始分析這個問題.對這個序列中的每乙個數的 有...

最長不下降子串行

a1 t0 an a an 1 2 b an c d n 1 求該序列最長不下降子串行長度 n不是很大顯然可以暴力。n很大呢?那就不斷減迴圈節長度直至減到乙個閾值內,再暴力。正確性顯然,只要閾值不要設太小。include include include define fo i,a,b for i a...

最長不下降子串行

最長不下降子串行解法 第一種就是普通的dp方法 for int i 1 i n i dp 0 1 for int i 1 i n i ans max ans,dp i cout 主要記錄一下n logn的寫法 二分 主要思路 用乙個陣列 b 來記錄最長的子串行 一開始讓b 1 a 1 陣列a為輸入的...