資料結構與演算法 24最長上公升子串行

2021-10-22 07:31:07 字數 1083 閱讀 1464

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

output

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

sample input

7

1 7 3 5 9 4 8

sample output

參考程式

#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 中找到乙個...