動的計画法テンプレート-Pythonバージョン

この記事はhttps://leetcode.com/discuss/general-discussion/458695/Dynamic-Programming-Patternsからのもので この外国のネチズン、私は ローカリゼーションを担当しています

目次

1.目標に到達するための最小(最大)パスタイプの問題

2つの異なる方法

3.統合間隔

4、ストリングDP問題

第四に、意思決定の問題を作る


1.目標に到達するための最小(最大)パスタイプの問題

このタイプの問題の説明は次のとおりです。目標が与えられた場合、目標に到達するための最小(最大)コスト(コスト)/パス(パス)/合計(合計)を見つけます。

一般的なテンプレートコードは次のとおりです。

for i in range(1,target+1):
    for j in range(len(ways)):# ways:达到目标的方法个数
        if ways[i]<=i:
            dp[i] = min(dp[i], dp[i - ways[j]] + 代价(cost) / 路径(path) / 总和(sum))
return dp[target]

同様の質問は次のとおりです。

  1. 最小限のコストで階段を上る
  2. 最小パス合計
  3. 交換交換
  4. 降下経路の最小合計
  5. 最低運賃
  6. キーが2つしかないキーボード

  7. 完全平方数

  8. ラストストーンウェイトII 

  9. 三角形 

  10. 1と0 

  11. マキシマルスクエア

  12. コイン交換

  13. 最小の正方形で長方形を並べて表示

  14. ダンジョンゲーム

  15. 給油停止の最小数 

2つの異なる方法

このタイプの問題の説明は次のとおりです。目標が与えられたら、目標に到達するためのさまざまな方法を見つけます

一般的なテンプレートコードは次のとおりです。

for i in range(1,target):
    for j in range(len(ways)):
        if ways[j]<=i:
            dp += dp[i-ways[j]]
return dp[target] 

同様の質問は次のとおりです。

  1. 階段を上る 
  2. ユニークなパス 
  3. 目標合計のダイスロールの数

繰り返し回数を示す質問もあります。この場合、ループを追加して各繰り返しをシミュレートします。

  1. チェス盤のナイト確率 
  2. 目標額 
  3. コンビネーションサムIV 
  4. ナイトダイヤラ 
  5. ダイスロールシミュレーション 
  6. パーティションの等しいサブセットの合計 
  7. スープサービング 
  8. ドミノとトロミノタイリング
  9. シーケンスを増やすための最小スワップ
  10. 最長増加部分列の数 
  11. ユニークパスII
  12. 境界パス外 
  13. いくつかのステップの後に同じ場所にとどまる方法の数 
  14. 母音の順列を数える 

3.統合間隔

この種の問題の説明は次のとおりです。最良の値を取得するための一連の数値が与えられると、現在の数値とその左側または右側の数値から問題の解決策を見つけることができます。

一般的なテンプレートコードは次のとおりです。

for l in range(1,n):
    for i in range(n-l):
        j = i+l
        for k in range(i,j):
            dp[i][j] = max(dp[i][j], dp[i][k] + result[k] + dp[k+1][j])
return dp[0][n-1]

同様の質問は次のとおりです。

  1. リーフ値からの最小コストツリー
  2. ユニークな二分探索木
  3. ポリゴンの最小スコア三角形分割 
  4. ボックスを削除する 
  5. 石をマージするための最小コスト 
  6. バーストバルーン 
  7. 数字が高いか低いかを推測するII

4、ストリングDP問題

このタイプの問題の説明は次のとおりです。2つの文字列s1とs2が与えられた場合、いくつかの結果を返します。

一般的なテンプレートコードは次のとおりです。

/**
i : 字符串s1的下标
j : 字符串s2的下标
**/
for i in range(1,n+1):
    for j in range(1,m+1):
        if s1[i-1] == s2[j-1]:
            dp[i][j] = #code....#
        else:
            dp[i][j] = #code....#

文字列を自分に与える場合、方法はほとんど同じです。

for l in range(1,n):
    for i in range(n-l):
        j = i+l
        if s[i] == s[j]:
            dp[i][j] = /*code*/
        else:
            dp[i][j] = /*code*/

同様の質問は次のとおりです。

  1. 最長共通部分列 
  2. 回文部分文字列
  3.  最長のパリンドロームサブシーケンス 
  4. 最短の一般的なスーパーシーケンス 
  5. 距離の編集
  6. 異なるサブシーケンス 
  7. 2つの文字列の最小ASCII削除合計
  8. 最長の回文部分文字列

第四に、意思決定の問題を作る

問題の説明:一連の値を指定して、答えを見つけ、現在の値を選択または無視するオプションを提供します

一般的なテンプレートコード:

#i: 一组值的下标
#j: 忽略j值的选项
for i in range(1,n):
    for j in range(1,k+1):
        dp[i][j] = max(dp[i][j], dp[i-1][j] + arr[i], dp[i-1][j-1])
        dp[i][j-1] = max(dp[i][j-1], dp[i-1][j-1] + arr[i], arr[i])
        

同様の質問は次のとおりです。

  1. ハウス強盗 
  2. 株式を売買するのに最適な時期
  3. 取引手数料で株式を売買するのに最適な時期
  4. クールダウンで株式を売買するのに最適な時期 
  5. 株式を売買するのに最適な時期III 
  6. 株式を売買するのに最適な時期IV 

実際、多くの問題は動的計画法なしで解決できます。これは同様の問題の解決策の要約です。

おすすめ

転載: blog.csdn.net/Matrix_cc/article/details/109584049