問題描述:給出乙個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]maxm[ i]+1 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)def
print
(maxascendorder([1
,2,3
,4,5
,6,7
]))# 7
(maxascendorder([1
,3,2
,4,5
,3,9
]))# 5
(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。是指在乙個序列中求長度最長的乙個上公升子串行的問題,是動態規劃中乙個相當經典問題。在這裡我們可以看到,這個上公升實質上就是乙個對 進行定義的過程,所以我們求解的其實是一類問題...