給乙個陣列a1, a2 ... an,找到最長的不下降子串行ab1<=ab2
<= .. <=abk,其中b1輸出長度即可。
第一行,乙個整數n。第二行 ,n個整數(n < = 5000)
輸出k的極大值,即最長不下降子串行的長度
59 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為輸入的...