この記事はhttps://leetcode.com/discuss/general-discussion/458695/Dynamic-Programming-Patternsからのもので、 この外国のネチズン、私は ローカリゼーションを担当しています
目次
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]
同様の質問は次のとおりです。
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]
同様の質問は次のとおりです。
繰り返し回数を示す質問もあります。この場合、ループを追加して各繰り返しをシミュレートします。
- チェス盤のナイト確率
- 目標額
- コンビネーションサムIV
- ナイトダイヤラ
- ダイスロールシミュレーション
- パーティションの等しいサブセットの合計
- スープサービング
- ドミノとトロミノタイリング
- シーケンスを増やすための最小スワップ
- 最長増加部分列の数
- ユニークパスII
- 境界パス外
- いくつかのステップの後に同じ場所にとどまる方法の数
- 母音の順列を数える
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]
同様の質問は次のとおりです。
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*/
同様の質問は次のとおりです。
第四に、意思決定の問題を作る
問題の説明:一連の値を指定して、答えを見つけ、現在の値を選択または無視するオプションを提供します
一般的なテンプレートコード:
#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])
同様の質問は次のとおりです。
実際、多くの問題は動的計画法なしで解決できます。これは同様の問題の解決策の要約です。