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

2021-10-07 19:29:42 字數 1562 閱讀 7979

學習動態規劃問題(dp問題)中,其中有乙個知識點叫最長上公升子串行(longest increasing subsequence),也可以叫最長非降序子串行,簡稱lis。簡單說一下自己的心得。

我們都知道,動態規劃的乙個特點就是當前解可以由上乙個階段的解推出, 由此,把我們要求的問題簡化成乙個更小的子問題。子問題具有相同的求解方式,只不過是規模小了而已。最長上公升子串行就符合這一特性。我們要求n個數的最長上公升子串行,可以求前n-1個數的最長上公升子串行,再跟第n個數進行判斷。求前n-1個數的最長上公升子串行,可以通過求前n-2個數的最長上公升子串行……直到求前1個數的最長上公升子串行,此時lis當然為1。

讓我們舉個例子:求 2 7 1 5 6 4 3 8 9 的最長上公升子串行。我們定義d(i) (i∈[1,n])來表示前i個數以a[i]結尾的最長上公升子串行長度。

前1個數 d(1)=1 子串行為2;

前2個數 7前面有2小於7 d(2)=d(1)+1=2 子串行為2 7

前3個數 在1前面沒有比1更小的,1自身組成長度為1的子串行 d(3)=1 子串行為1

前4個數 5前面有2小於5 d(4)=d(1)+1=2 子串行為2 5

前5個數 6前面有2 5小於6 d(5)=d(4)+1=3 子串行為2 5 6

前6個數 4前面有2小於4 d(6)=d(1)+1=2 子串行為2 4

前7個數 3前面有2小於3 d(3)=d(1)+1=2 子串行為2 3

前8個數 8前面有2 5 6小於8 d(8)=d(5)+1=4 子串行為2 5 6 8

前9個數 9前面有2 5 6 8小於9 d(9)=d(8)+1=5 子串行為2 5 6 8 9

d(i)=max 我們可以看出這9個數的lis為d(9)=5

總結一下,d(i)就是找以a[i]結尾的,在a[i]之前的最長上公升子串行+1,當a[i]之前沒有比a[i]更小的數時,d(i)=1。所有的d(i)裡面最大的那個就是最長上公升子串行。話不多說,show me the code!下面是**實現的演算法。

華為機試redraiment的走法

while

true

:try

: data =

n =int(

input()

) res =[1

for i in

range

(n)]

a =input()

.split(

)for n in

range

(n):

int(a[n]))

for i in

range

(len

(data)):

for d in

range

(len

(data[

:i])):

if data[d]

: res[i]

=max

(res[d]+1

, res[i]

)print

(max

(res)

)except

:break

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

問題描述 乙個數的序列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 等等...

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

動態規劃 儲存遞迴中間結果,減少遞迴次數 總時間限制 2000ms 記憶體限制 65536kb 描述 乙個數的序列 bi,當 b1 b2 bs的時候,我們稱這個序列是上公升的。對於給定的乙個序列 a1,a2 an 我們可以得到一些上公升的子串行 ai1,ai2 aik 這裡1 i1 i2 ik n。...

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

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