ダイナミックプログラミングは、DPテーブルを充填したものを覚えておくのではなく、部分問題を見つけることではありません。
53.最大サブアレイ最大サブシーケンスと
https://leetcode.com/problems/maximum-subarray/
タイトル:整数配列NUMS与えられる、(少なくとも1つの数を含む)の最大値と連続サブアレイを有する見つけて戻ります。
アイデア:対応するDPテーブルの[-2,1、-3,4、-1,2,1、-5,4]、サブ列インデックス= 3、インデックス= 0からサブ問題に対応するインデックス= 3最大のサブシーケンスとどのくらい。各部分問題について、二つのオプション、一人の子供には、一つだけが選択の前に最大値を加えた現在の値であり、現在の最後の列を選択するがあり、両者の大きい方を選択してください。DPテーブルの[-2,1、-2,4,3,5,6,1,5]、6の最大値ことを示しています。
クラス溶液{ 公共 のint maxSubArray(INT [] NUMS){ int型 A = はInteger.MIN_VALUE。 int型、なぜ= 0 ; 用(INT NUM NUMS){ 理由 = Math.max(なぜ+ NUM、NUM)。= Math.max(理由)。 } 戻り解像度。 } }
72.編集距離最短の編集距離
https://leetcode.com/problems/edit-distance/
タイトル:ワード1とWORD2二つの単語を考えると、ワード1はWORD2の必要な操作の最小数に変換されます見つけます。以下の3回の操作で単語を許可する:文字を置き換え、文字を削除し、文字を挿入します。
アイデア:
クラスソリューション{ 公共 のint minDistance(文字列WORD1、文字列WORD2){ int型 A = word1.length()。 INT B = word2.length()。 INT [] [] DP = 新しい INT [B + 1] [A + 1 ]。 DP [ 0] [0] = 0 。 以下のために(int型、iは+ 1 <; i = 1からiが++ ){ DP [ 0] [I] = I。 } のために(int型 i = 1; iはB + 1 <; iは++ ){ DP [I] [ 0] = I。 } のために(INT J = 1、J <B + 1、J ++ ){ ため(int型 i = 1; iが+ 1 <; Iは++ ){ 場合(word1.charAt(I-1)== word2.charAt(J-1 )){ DP [J] [I] DP [J-1] = [I-1 ]; } 他{ int型の TEMP = Math.min(DP [J-1] [i]は、DP [J-1] [I-1 ])。 DP [J] [I] = Math.min(TEMP、DP [j]は[I-1])+ 1 。 } } } 戻りDP [B] [A]。 } }
322コインの変更変更コイン
https://leetcode.com/problems/coin-change/
タイトル:あなたはコインと異なる宗派の総量を取得します。この量を構成するために必要なコインの最小数を計算する関数を書きます。この金額は、コインの任意の組み合わせを作ることができない場合は、-1を返します。
アイデア:
クラスソリューション{ 公共 のint coinChange(INT []コイン、int型の量){ int型のn = coins.length。 INT [] DP = 新しい INT [量+ 1 ]。 以下のために(int型私は++; iは量+ 1 <I = 1 {) DP [i]は =量+ 1 。 } DP [ 0] = 0 。 以下のために(int型 i = 1; iが<=量; iは++ ){ int型温度= I。 int型 CUR = 0; 用(INT J = 0であり、j <N; J ++ ){ 場合(コイン[J]> TEMP)を続けます。 CUR = 1 + DP [temp- コイン[J]。 DP [I] = Math.min(DP [I]、CUR)。 } } 場合(DP【量が<金額+ 1 ){ 戻りDP [量]。 } 他{ 戻り -1 。 } } }
416パーティション等しいサブセット和および二つの等しいサブセットに分割
https://leetcode.com/problems/partition-equal-subset-sum/
タイトル:唯一の非ヌルの正の整数を含む配列を指定し、和に等しい要素の2つのサブセットとなるよう配列は、2つのサブセットに分割することができるかどうかを見つけます。
アイデア:
クラスソリューション{ パブリック ブール canPartition(INT [] NUMS){ int型のn = nums.length。 INT合計= 0、目標= 0 。 以下のために(int型 ; iがn <I ++は、I = 0 ){ 合計 + = NUMS [I]を、 } もし(合計%2 == 1)を返す 偽。 目標 =合計/ 2 。 ブール [] DP = 新しい ブール [ターゲット+ 1 ]。 以下のための(int型I = 0; 私は、ターゲット+ 1を<; I ++ ){ DP [I] = 偽。 } DP [ 0] = 真。 以下のために(int型 i = 0; iは<N; iは++ ){ ための(int型 J =目標; jは> = NUMS [i]は、j-- ){ DPは[j]は | DP [j]を= DP [J- NUMS [I]]。 } } 戻りDP [ターゲット]。 } }
771宝石とストーンズ宝石や石
https://leetcode.com/problems/jewels-and-stones/
タイトル:Jは宝石の種類の文字列を表し、文字列Sは、あなたが持っている石を表します。S各文字は、あなたが持っている石の一種です。あなたが宝石の所属どのくらいかを知りたいです。Jの文字は独立しており、すべての文字のJとSは手紙です。大文字と小文字を区別するので、「」「」石は異なると考えられます。
アイデア:
クラスソリューション{ 公共 のint numJewelsInStones(文字列J、ストリングS){ int型 JL = J.length()。 INT SL = S.length()。 INT [] [] DP = 新しい INT [JL + 1] [SL + 1 ]。 以下のために(int型、1 + iはJL <; I = 0 iは++ ){ DP [I] [ 0] = 0 ; } のための(int型 i = 0; iが1 + SL <; Iは++ ){ DP [ 0] [I] = 0 。 } のために(int型 i = 1; iが1 + JL <; I ++){ int型温度= 0 。 用(INT J = 1; J <SL + 1、J ++ ){ 場合(S.charAt(J-1)== J.charAt(I-1))TEMP ++ 。 DP [I] [J] = TEMP + DP [I-1 ] [J]。 } } 戻りDP [JL] [SL]。 } }
動的プログラミング:
http://oj.leetcode.com/problems/triangle/(最短経路)
http://oj.leetcode.com/problems/subsets/(他の形態)
http://oj.leetcode.com /問題/サブセット-II /
// http://oj.leetcode.com/problems/edit-distance/(クラシック)
http://oj.leetcode.com/problems/word-break/
HTTP:// OJ。 leetcode.com/problems/word-break-ii/
http://oj.leetcode.com/problems/unique-binary-search-trees/(ダイナミックプログラミングは再帰を回避するため)
http://oj.leetcode.com/problems/パス-II-UNIQUE /
http://oj.leetcode.com/problems/scramble-string/
http://oj.leetcode.com/problems/palindrome-partitioning/
http://oj.leetcode.com/problems/パーティショニング-II-回文/
http://oj.leetcode.com/problems/interleaving-string/
http://oj.leetcode.com/problems/distinct-subsequences/
http://oj.leetcode.com/problems/decode-ways/
http://oj.leetcode.com/problems/gray-code/
ます。http: //oj.leetcode.com/problems/minimum-path-sum/