動態規劃(二) 經典問題之最長上公升子串行

2021-10-03 14:19:30 字數 2344 閱讀 8752

題目描述

乙個數的序列bi,當b1 < b2 < … < bs的時候,我們稱這個序列是上公升的。

對於給定的乙個序列(a1, a2, …, an),我們可以得到一些上公升的子串行(ai1, ai2, …, aik),這裡1 <= i1 < i2 < … < ik <= n。比如,對於序列(1, 7, 3, 5, 9, 4, 8),有它的一些上公升子串行,如(1, 7), (3, 4, 8)等等。這些子串行中最長的長度是4,比如子串行(1, 3, 5, 8).

你的任務,就是對於給定的序列,求出最長上公升子串行的長度。

輸入

輸入的第一行是序列的長度n (1 <= n <= 1000)。第二行給出序列中的n個整數,這些整數的取值範圍都在0到10000。

輸出

最長上公升子串行的長度。

樣例輸入

717

3594

8

樣例輸出

4
tip:子串行在序列中並非連續。

若要找到第 i 個位置為終點的最長上公升子串行,可以找到在 i 左邊的第 j 位的最長上公升子串行長度,並加1

這樣,問題就劃分為若干個子問題,可以從第1個位置計算至第 i-1 個位置,找到最長的上公升子串行。

用樣例模擬過程:

71 7 3 5 9 4 8

①i==2 7:

j=1:a[i]>a[j] -> maxlen[2]=max(maxlen[2]=1,maxlen[1]+1=2)=2;

②i==3 3:

j=1:a[i]>a[j] -> maxlen[3]=max(maxlen[3]=1,maxlen[1]+1=2)=2;

j=2:a[i]③i==4 5:

j=1:a[i]>a[j] -> maxlen[4]=max(maxlen[4]=1,maxlen[1]+1=2)=2;

j=2:a[i]a[j] -> maxlen[4]=max(maxlen[4]=2,maxlen[3]+1=3)=3;

④i==5 9

j=1:a[i]>a[j] -> maxlen[5]=max(maxlen[5]=1,maxlen[1]+1=2)=2;

j=2:a[i]>a[j] -> maxlen[5]=max(maxlen[5]=2,maxlen[2]+1=3)=3;

j=3:a[i]>a[j] -> maxlen[5]=max(maxlen[5]=3,maxlen[3]+1=3)=3;

j=4:a[i]>a[j] -> maxlen[5]=max(maxlen[5]=3,maxlen[4]+1=4)=4;

⑤i==6 4

j=1:a[i]>a[j] -> maxlen[6]=max(maxlen[6]=1,maxlen[1]+1=2)=2;

j=2:a[i]a[j] -> maxlen[6]=max(maxlen[6]=2,maxlen[3]+1=3)=3;

j=4:a[i]⑥i==7 8

j=1:a[i]>a[j] -> maxlen[7]=max(maxlen[7]=1,maxlen[1]+1=2)=2;

j=2:a[i]>a[j] -> maxlen[7]=max(maxlen[7]=2,maxlen[2]+1=3)=3;

j=3:a[i]>a[j] -> maxlen[7]=max(maxlen[7]=3,maxlen[3]+1=3)=3;

j=4:a[i]>a[j] -> maxlen[7]=max(maxlen[7]=3,maxlen[4]+1=4)=4;

j=5:a[i]a[j] -> maxlen[7]=max(maxlen[7]=4,maxlen[6]+1=4)=4;

#include.h>

#define fio ios:

:sync_with_stdio(0

);cin.

tie(0)

;cout.

tie(0)

;using namespace std;

const

int maxn =

1010

;int a[maxn]

;int maxlen[maxn]

;int

main()

for(

int i =

2; i <= n; i++)}

} cout <<

*max_element

(maxlen+

1,maxlen+n+1)

<< endl;

}

動態規劃 之 最長上公升子串行

乙個數的序列bi,當b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2,an 我們可以得到一些上公升的子串行 ai1,ai2,aik 這裡1 i1 i2 ik n。比如,對於序列 1,7,3,5,9,4,8 有它的一些上公升子串行,如 1,7 3,4,8 等等。這些子串...

動態規劃之最長上公升子串行

北大郭煒老師講的能採用動態規劃求解問題的特點 1 問題具有最優子結構的性質 2 無後效性。實現動態規劃的三個步驟 1 講原問題分解為子問題 2 確定狀態以及初始狀態 邊界值 3 狀態轉移方程 人人為我 遞推型 第一步的子問題就是a i 為終點的最長上公升子串行。include includeusin...

動態規劃之最長上公升子串行

動態規劃指的是將乙個繁雜的問題分解成子問題之後,通過求解子問題的最優解,從而求得整體最優解。輸入資料 輸入的第一行是序列的長度n 1 n 1000 第一行給出序列的n個整數,這些整數的取值範圍在0 10000.輸出要求 最長上公升子串行的長度。輸入樣例 7 1 7 3 5 9 4 8 輸出樣例 範例...