序列型動態規劃 最長遞增子串行

2021-10-18 23:00:36 字數 1111 閱讀 8502

給你乙個整數陣列 nums ,找到其中最長嚴格遞增子串行的長度。

子串行是由陣列派生而來的序列,刪除(或不刪除)陣列中的元素而不改變其餘元素的順序。例如,[3,6,2,7] 是陣列 [0,3,1,6,2,2,7] 的子串行。

示例 :

輸入:nums = [10,9,2,5,3,7,101,18]

輸出:4

解釋:最長遞增子串行是 [2,3,7,101],因此長度為 4 。

這是典型的序列型別動態規劃題目。

最後乙份:對於最優的策略,一定有最後乙個元素a[j]。

第一種情況:最優策略中最長上公升子串行為,答案就是1

第二種情況子串行長度大於1,那麼最優策略中a[j]前乙個元素是a[i],並且a[i]因為是最優策略,那麼它選中的以a[j]結尾的上公升子串行一定是最長的。

但是因為不確定a[j]前乙個元素是誰,因此需要列舉每個i,轉化為子問題:i綜上所述,我們可以假設狀態:f[i]表示以a[i]結尾的最長上公升子串行的長度。

f[i]表示以a[i]結尾的最長上公升子串行的長度。

情況2必須滿足i>0,a[j]>a[i],滿足單調性

初始條件:空

從小大到計算。

答案是max

演算法時間複雜度o(n*n),空間複雜度o(n)

class

solution

:def

lengthoflis

(self, nums: list[

int])-

>

int:

iflen

(nums)==0

:return

0 dp =[0

for i in

range

(len

(nums))]

dp[0]

=1max1 =

1for i in

range(1

,len

(nums)

):

動態規劃 最長遞增子串行

給出序列 1 2 3 4 2 5 3 4 a 1 1,a 2 2,a 7 3,a 8 4 求其最長的遞增子串行,以上最長遞增子串行為 1 2 3 4 5 問題細分 初始化條件f 1 1,序列只有1個長度即為1 f 2 a 2 與下標小於2的比較,即a 1 比較,a 2 a 1 因此更新f 2 f 1...

動態規劃 最長遞增子串行

給定乙個無序的整數陣列,找到其中最長上公升子串行的長度 例項 輸入 10,9,2,5,3,7,101,18 輸出 4 解釋 最長的上公升子串行為 2,3,7,101 長度為4說明 可能會有多種最長上公升子串行的和,只需要輸出對應長度即可 演算法的時間複雜度應為o n2 首先,dp陣列的定義如下 dp...

動態規劃 最長遞增子串行

最長遞增子串行是動態規劃中最經典的問題之一,該問題描述的是在乙個已知序列中,取出若干元素 不必連續 組成乙個新的序列,子串行的各個數先後順序保持不變,且對子序列中的任意下標x令dp i 表示以a i 作為末尾的最長遞增子串行的長度。於是,通過設定這麼乙個陣列,最長遞增子串行的長度便是陣列dp中的最大...