動態規劃法求解最長上公升子串問題

2021-10-04 18:36:05 字數 2644 閱讀 9786

問題描述:給出乙個array的數值(有正有負),給出乙個最長的上公升子串(可以不連續)的長度

定義子狀態:m[i

]m[i]

m[i]

表示以陣列元素a[i

]a[i]

a[i]

結尾的最長上公升子串的長度

狀態轉移關係:m[j

]=

max⁡

i

a[i]

j]m[

i]+1

m[j]=\max \limits_{im[

j]=i

a[i]

j]max​m[

i]+1

def

maxascendorder

(array)

:# 僅要得到最大上公升子串的長度

m =[1

for _ in

range

(len

(array))]

# 初始狀態值,記錄當前元素為子串最後乙個元素的最大長度

for i in

range(1

,len

(array)):

max_len = m[i]

for j in

range(0

, i)

:if array[i]

> array[j]

: max_len =

max(max_len, m[j]+1

) m[i]

= max_len

return

max(m)

print

(maxascendorder([1

,2,3

,4,5

,6,7

]))# 7

print

(maxascendorder([1

,3,2

,4,5

,3,9

]))# 5

print

(maxascendorder([3

,2,1

,2,6

,4,7

]))# 4

思考:如果除了給出最大長度值,還要給出對應的子串呢?

解決方案:再構造乙個狀態陣列,記錄當前位置最大長度對應的子串序列

def

maxascendorder2

(array)

:# 不僅要得到最大上公升子串的長度,想要給出相應的一組子串

m =[1

for _ in

range

(len

(array))]

# 初始狀態值,記錄當前元素為子串最後乙個元素的最大長度

s =[[

]for _ in

range

(len

(array))]

# 初始狀態值,記錄當前元素為子串最後乙個元素的最大長度的子串序列

s[0]

=[array[0]

]for i in

range(1

,len

(array)):

max_len = m[i]

max_len_arrary =

[array[i]

]for j in

range(0

, i)

:if array[i]

> array[j]

: max_len =

max(max_len, m[j]+1

)if m[j]+1

== max_len:

max_len_arrary = s[j]

+[array[i]

] m[i]

= max_len

s[i]

= max_len_arrary

return

max(m)

, s[m.index(

max(m)

)]

length, array = maxascendorder2([1

,2,3

,4,5

,6,7

])print

(length)

# [1, 2, 3, 4, 5, 6, 7]

print

(array)

# 7length, array = maxascendorder2([1

,3,2

,4,5

,3,9

])print

(length)

# [1, 2, 4, 5, 9]

print

(array)

# 5length, array = maxascendorder2([3

,2,1

,2,6

,4,7

])print

(length)

# [1, 2, 4, 7]

print

(array)

# 4

動態規劃法求解最長遞增子串行問題

給定乙個無序的整數序列a 0 n 1 求其中最長遞增子串行的長度。例如,a n 9,其最長遞增子串行為,結果為5。設計動態規劃陣列為一維陣列dp,dp i 表示a 0 i 中以a i 結尾的最長遞增子串行的長度。對應的狀態轉移方程如下 求出dp後,其中最大元素即為所求。int a int n siz...

動態規劃法求解RMQ

題目描述 思路分析 下面把sparse table演算法分成預處理和查詢兩部分來說明 以求最小值為例 預處理 預處理使用dp的思想,f i,j 表示 i,i 2 j 1 區間中的最小值,我們可以開闢乙個陣列專門來儲存f i,j 的值。例如,f 0,0 表示 0,0 之間的最小值,就是num 0 f ...

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

原文 主題 動態規劃 最長上公升子串行問題,也就是longest increasing subsequence,縮寫為lis。是指在乙個序列中求長度最長的乙個上公升子串行的問題,是動態規劃中乙個相當經典問題。在這裡我們可以看到,這個上公升實質上就是乙個對 進行定義的過程,所以我們求解的其實是一類問題...