題目描述
乙個數的序列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 輸出樣例 範例...