演算法學習(十七)

2021-10-22 20:11:59 字數 2535 閱讀 4961

動態規劃演算法:每次決策依賴於當前狀態,又隨即引起狀態的轉移。乙個決策序列就是在變化的狀態中產生出來的,所以,這種多階段最優化決策解決問題的過程就稱為動態規劃。

在查詢有很多重疊子問題的情況的最優解有效。動態規劃儲存子問題的解,避免重複計算。

字串編輯

解決動態規劃問題的關鍵是找到狀態轉移方程,這樣就可以通過計算和儲存子問題的解來解決最終問題。

給你兩個單詞 word1 和 word2,請你計算出將 word1 轉換成 word2 所使用的最少運算元 。

你可以對乙個單詞進行如下三種操作:

插入乙個字元

刪除乙個字元

替換乙個字元

示例 1:

輸入:word1 =

"horse"

, word2 =

"ros"

輸出:3

解釋:horse -

>

rorse

(將 'h' 替換為 'r'

)rorse -

>

rose

(刪除 'r'

)rose -

>

ros(刪除 'e')/

/leetcode-cn.com/problems/edit-distance

定義乙個二維陣列dp[i][j],表示將第乙個字串到位置i為止,和第二個字串到位置j為止最多需要幾步編輯。當第i位和第j位對應字元相同,則dp[i][j]等於dp[i-1][j-1];當二者對應的字元不同時,修改消耗dp[i-1][j-1]+1,插入i位置、刪除j位置則是dp[i][j-1]+1,插入j位置、刪除i位置則是p[i-1][j]+1

class

solution

: def mindistance

(self, word1: str, word2: str)

-> int:

m,n =

len(word1)

,len

(word2)

dp =[[

0]*(n+1)

for _ in

range

(m+1)]

for i in

range

(m+1):

for j in

range

(n+1):

if i ==0:

dp[i]

[j]= j

elif j ==0:

dp[i]

[j]= i

else

:if word1[i-1]

== word2[j-1]

: a =

0else

: a =

1 dp[i]

[j]=

min(dp[i-1]

[j-1

]+a,

min(dp[i-1]

[j]+

1,dp[i]

[j-1]+

1))return dp[m]

[n]

最初在乙個記事本上只有乙個字元 『a』。你每次可以對這個記事本進行兩種操作:

copy all (複製全部) : 你可以複製這個記事本中的所有字元(部分的複製是不允許的)。

paste (貼上) : 你可以貼上你上一次複製的字元。

給定乙個數字 n 。你需要使用最少的操作次數,在記事本中列印出恰好 n 個 『a』。輸出能夠列印出 n 個 『a』 的最少操作次數。

示例 1

:輸入:

3輸出:

3解釋:

最初, 我們只有乙個字元 'a'。

第 1 步, 我們使用 copy all 操作。

第 2 步, 我們使用 paste 操作來獲得 'aa'。

第 3 步, 我們使用 paste 操作來獲得 'aaa'。

2-keys-keyboard

由於貼上操作是倍數增加,因此需要乘除法計算位置,定義dp陣列,其中位置i表示延展到長度i的最少操作次數。對於每個位置j,如果j可以被i整除,那麼長度i就可以由j操作得到,其操作等價於把長度為1的a延展到長度為i/j。因此狀態轉移公式dp[i]=dp[j]+dp[i/j]

class

solution

: def minsteps

(self, n: int)

-> int:

dp =[0

]*(n+1

) h =

int(n**

0.5)

for i in

range(2

,n+1):

dp[i]

= i for j in

range(2

,h+1):

if i%j ==0:

dp[i]

= dp[j]

+ dp[i//j]

break

return dp[n]

演算法學習 Union Find演算法

union find演算法有它的實際用途。多用於動態連通的應用場景。union find演算法是 給出兩個節點,判斷它們是否連通,如果連通,是不需要給出具體的路徑的 舉兩個例子作為主要表現 1 在網路連線中,當發現沒有連線的兩個節點,可以把他們連線起來,一旦節點都連線起來,又能把多餘的線拆除,這時候...

演算法學習 KM演算法

km演算法 用於求二分圖的最佳完美匹配 即權值最大的完美匹配 如果你也是個剛來學習km演算法的人 大概的用途肯定還是知道的吧 還是直接說重點吧 首先 理解km演算法前 必須有以下3個概念 1.可行頂標 對於乙個賦值二分圖g x,y,e,w x,y 代表二分圖的兩邊頂點標號 e代表邊 w代表邊的權值 ...

演算法 演算法學習01

貪婪 可以理解為最簡單基礎的求解方式,特點是 短視性 從這個特點入手很容易理解每一步取其最優的原理。雖然最終結果不一定是最好的,但是一定是較好的而且是最簡便的。因此在不過分追求最優結果或者對速度的要求高於結果的情況下,貪婪是不錯的選擇。分治可以理解為大事化小小事好搞,與貪婪的每一步的 串聯 不同,分...