コンセプト
【】Geekforgeeks
ダイナミックプログラミングは主に平野再帰オーバーの最適化です。私たちは同じ入力のコールを繰り返した再帰的なソリューションを参照してくださいどこに、我々は、動的プログラミングを使用して、それを最適化することができます。アイデアは、単に我々は彼ら後で必要に再計算する必要はありませんのでことを、部分問題の結果を格納することです。この単純な最適化は、指数関数から多項式時間の複雑さを低減します。私たちは、フィボナッチ数列のための単純な再帰的な解決策を記述する場合たとえば、私たちは指数時間の複雑さを取得し、我々は部分問題の解を格納することによって、それを最適化すれば、時間の複雑さは、リニアに減少します。
ダイナミックプログラミングは、主要な最適化手法のための単純な再帰的です。私たちは、同じ入力に対して繰り返し呼び出される再帰的なソリューションを見ると、我々は、動的計画法を最適化することができ繰り返されます。我々は彼らのその後の使用時に計算を繰り返す必要はありませんので、この方法は、簡単なストレージサブ問題の結果です。この単純な最適化は、指数関数から多項式時間の複雑さを軽減します。私たちは、単純な再帰的なソリューションのフィボナッチ数列について書く場合たとえば、私たちは時間インデックスの複雑さを得るが、我々は時間の複雑さの線形を減らすために、サブ問題によってストレージを最適化します。
シナリオ
一般的な崩壊のアイデア
四つの要素をプログラミングするダイナミック:
1.ステータス
2.状態遷移方程式
3.初期化
4.結果
トピックエクササイズ
Fibonacci数列 leetcode 509
最大の連続サブシーケンスleetcode 53
// 入力:[-2,1、-3,4、-1,2,1、-5,4]、 // 出力:6 @ 説明:連続サブアレイ[4、-1,2,1]そして、6の最大。 クラスソリューション{ 公共 のint maxSubArray(INT [] NUMS){ int型 N- = nums.length、maxSum NUMS = [0 ]; のための(INT I = 1; I <N-; ++ I){ IF(NUMS [I - 1 ]> 0)NUMS [I] + = NUMS [I - 1 ]; maxSum = Math.max(NUMS [I]、maxSum); } 戻りmaxSumを; } }
ワイルドカードのマッチングleetcode 44
// 入力: // S = "adceb" // P = "A * B *" // 出力:trueに // 説明:最初の'*'、第二に、空の文字列を一致させることができます'*'マッチを文字列"DCE" クラスソリューション{ パブリック ブールIsMatch(S列、文字列P){ int型、M = s.length()、= N- p.length(); ブール [] [] = F 新しい新しい ブール。[M + 1 ] [N- + 1 ]、 F [ 0] [0] = trueに、 のために(INT I = 1; I <= N; I ++ ){ F [ 0] [I] = F [0] [I - 1] && p.charAt(I - 1)== ' ; } 以下のために(INT I = 1; I <= M; I ++ ){ ため(INT J = 1; J <= nであり、j ++ ){ 場合(s.charAt(I - 1)== p.charAt(j - 1) || p.charAt(j - 1)== '?' ){ F [I] [J] = F [I - 1] [J - 1 ]。 } であれば(p.charAt(j - 1)== '*' ){ F [I] [J] = F [I] [J - 1] || F [I - 1 ] [J]。 } } } 戻り[M] F [N]。 } }
参考資料
1. https://www.geeksforgeeks.org/dynamic-programming/
2. https://leetcode-cn.com/problems/wildcard-matching/solution/dong-tai-gui-hua-si-yao-su-by-a380922457-4/
3. https://leetcode-cn.com/problems/maximum-subarray/solution/zui-da-zi-xu-he-by-leetcode/