輸入的第一行是序列的長度n (1 <= n <= 1000)。第二行給出序列中的n個整數,這些整數的取值範圍都在0到10000。
output
最長上公升子串行的長度。
sample input
7sample output 參考程式1 7 3 5 9 4 8
#include
#include
#define len 1000
intmax
(int a,
int b)
intmain()
for(i=
1;i}int max=-1
;for
(i=0
;iprintf
("%d\n"
,max)
;return0;
}
分析:這是一道動態規劃問題的一道典型問題。關鍵問題是如何找到狀態轉移方程,即遞推式。尋找遞推式從只有一項元素的極端狀態入手,逐步擴大規模發現規律。
設dp[i]表示以元素a[i]為結尾的最大遞增子串行的長度.
如果只有乙個元素,例如「3」,那預設為上公升,即dp[0]=1.
如果有兩個元素,例如「3 1」,這個序列本身就是遞減的,所以1的存在並沒有使得序列增長。或者說,a[i]作為某個序列的結尾,必須要新增在比它小的元素後邊,這樣能保證以元素a[i]為結尾的序列仍舊是遞增的;然而在下標i之前,比a[i]小的元素可能有很多,那麼究竟應該加在哪個元素後面呢?應當加在dp取最大值的所對應元素的後邊,相當於強強聯合,每一步都只併入上一步最長的序列(當然還要保證序列遞增的前提下),遞推下去,那麼就能得出問題的全域性解。
dp陣列的求取借助了內外兩層迴圈,因而演算法的時間複雜度應為o(n^2)
希望大家批評指正!
Dp 最長上公升子串 最長上公升子串行
乙個數的子串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,5,9 等等。這些子串中最長...
最長上公升子串行nlogn演算法
這題目是經典的dp題目,也可叫作lis longest increasing subsequence 最長上公升子串行 或者 最長不下降子串行。很基礎的題目,有兩種演算法,複雜度分別為o n logn 和o n 2 a.o n 2 演算法分析如下 a 1 a n 存的都是輸入的數 1 對於a n 來...
最長上公升子串行nlogn演算法
定義d k 長度為k的上公升子串行的最末元素,若有多個長度為k的上公升子串行,則記錄最小的那個最末元素。注意d中元素是單調遞增的,下面要用到這個性質。首先len 1,d 1 a 1 然後對a i 若a i d len 那麼len d len a i 否則,我們要從d 1 到d len 1 中找到乙個...