專題講解 線性DP

2021-10-07 12:40:33 字數 3272 閱讀 1542

狀態轉移方法是乙個線性的轉移,每一行依次求解。

例題:三角形最大路徑

最長上公升子串行和如何得到該序列

乙個非dp的nlgn演算法

最長子序列

編輯距離

多次編輯距離

這道題目思路不難,但是細節很多,需要統一處理儲存的三角形和dp的座標對應的關係。

# 自下往上做更方便

n =int

(input()

)# 這裡我多開了一些dp的空間,這樣可以簡化初始化的問題

dp =[[

0]*(n+1)

for _ in

range

(n+2)]

# 這裡注意好座標對應,從1開始,到n 結束

s =[[0

]]for i in

range

(n):

a =list

(map

(int

,input()

.split())

)for i in

range

(n,0,-

1):for j in

range

(i):

dp[i]

[j]=

max(dp[i+1]

[j], dp[i+1]

[j+1])

+s[i]

[j]print

(dp[1]

[0])

dp的思路,dp[i]維護了乙個陣列前 i 個數字情況下,且取當前數字的最大值。

class

solution

:def

lengthoflis

(self, nums: list[

int])-

>

int:

## 時間複雜度是o(n2)

ifnot nums:

return

0 n =

len(nums)

dp =[1

]*nfor i in

range

(n):

for j in

range

(i):

if nums[i]

>nums[j]

: dp[i]

=max

(dp[i]

, dp[j]+1

)return

max(dp)

維護乙個陣列f[i],每次記錄從**轉移過來。最後進行還原即可。

class

solution

:def

lengthoflis

(self, nums: list[

int])-

>

int:

## 時間複雜度是o(n2)

ifnot nums:

return

0 n =

len(nums)

dp =[1

]*nf =[0

]*nfor i in

range

(n):

for j in

range

(i):

if nums[i]

>nums[j]

:if dp[j]+1

>dp[i]

: f[i]

= j dp[i]

=max

(dp[i]

, dp[j]+1

) max_ =

max(dp)

i = dp.index(max_)

ans =

while

len(ans)

) i = f[i]

print

(ans)

return max_

另外乙個問題就是可以給出乙個nlgn的演算法,這裡寫出。利用了二分的思路。

維護乙個嚴格單調遞增的序列。

class

solution

(object):

deflengthoflis

(self, nums)

:## 如果 cell 中元素都比它小,將它插到最後。否則,用它覆蓋掉比它大的元素中最小的那個。

## 這裡的cell並不是實際上的數字,但是長度是正確的

ifnot nums:

return

0 n =

len(nums)

cell =

[nums[0]

]for i in nums[1:

]:if i>cell[-1

]:else

: m =

len(cell)

right = m-

1 left =

0# 二分查詢插入的位置,取替換相關位置上,最小的

# 二分的目標,找到小於這個數字的最大值,因此選left

其實也只是對編輯距離的問題進行了應用。**這裡不具體寫了,思路是對於每個帶估計的字串,都與匹配字串陣列進行依次計算,看看最短編輯距離是多大,然後與操作次數限制進行比較。時間複雜度是o(n

m∗100)

o(nm*100)

o(nm∗1

00)

Python專題講解

python中的切片表示法 使用python實現乙個迴圈輸入 在python中複製乙個列表list 理解python的引數傳遞 理解python雙星和單星對引數的作用 理解python中的作用域規則 python中yield關鍵字的作用 在python中呼叫外部命令 if name main 的作用...

動態規劃專題 1 簡單線性DP

本專題文章建立在本人多年寫動態規劃 的經驗上,用以自己回顧總結,也幫助朋友初步理解,部分理解可能和教科書有所出入,要參加演算法考試的同學請以教科書為準。在現實生活中,有一類活動的過程,由於它的特殊性,可將過程分成若干個互相聯絡的階段,在它的每一階段都需要作出決策,從而使整個過程達到最好的活動效果。因...

專題 線性基

線性基性質 線性基中所有的數都可以經過一些異或操作還原出原數列。線性基任意幾個元素異或起來不為 0 若這是原數列的線性基,那麼這一定是滿足性質 1,2 的元素最少的一種構造方案。線性基推論 最多需要 mathrm 個數,就可以通過異或操作轉化為乙個數列。構造線性基 void add ll x,int...