LeetCode-CombinationSumIVケースへの動的プログラミング

要約:

多くの場合、インタビューの中で遭遇した動的なプログラミングの問題の問題の一つは、動的計画法の一般的な定義によると、その一般的な解決策を解決するために、小さな問題に大きな問題を打破することですが、私は実用的な問題の多くを満たしたときに、アイデアを余儀なくされています分解経路の必要性と合理性を無視して、分解される問題。ギャングスターが知っているほとんどの記事を参照してください。動的計画の核となるアイデアは、ということです小さな問題の分解が問題に行くために再利用することができ、我々は小さな問題に大きな問題になるとき言うことですつまり、考慮に入れて、解決すべき小さな問題を解決する過程での役割のための大きな問題を解決するための小さな問題があるが、必要性という大きな問題には影響ありません(パッケージなどの多くは、理論の多くが類似しているようだが、核となるアイデアは非常に似ています)。

例:

問題の和IV LeetCode-組み合わせ例:

タイトルはそれを説明します。

すべての正の数と重複なしで整数配列を考えると、正の整数ターゲットまで追加可能な組み合わせの数を見つけます。

例:

NUMS = [1、2、3]
 ターゲット = 4

可能な組み合わせの方法があります。
(1、1、1、1)
(1、1、2)
(1、2、1)
(1、3)
(2、1、1)
(2,2)
(3、1)

異なる配列は異なる組合せとしてカウントされることに留意されたいです。

出力がある。したがって、7

何の困難、再帰まあを感じていないように見えませんが、1つのレベルダウンは十分ではありません!だから私は、再帰的な解決策のアイデアを書きました:
1  プライベート INT combinationSum4_recur(INT [] NUMS、int型のターゲット){
 2          INTの和= 0 3          INT I:NUMS){
 4              もし(I ==ターゲット)和+ = 1 ;
5              そう なら(I <ターゲット)和+ = combinationSum4_recur(NUMS、ターゲット- I)。
6          }
 7          戻り和。
8 }

私たちは、TLE、その後、まったく同じこの問題を解決するために頭脳やアイデアを使用します。

エラーの例:脳が解決する場合NUMS = {2,1,3}ターゲット= 35、私の一日ああ、あなたは嘔吐のように感じる必要があります。

これは、その後、その後、最初に、1 1 1 + 1である理由私は考える必要があります..だから 次いでemmmm、プログラム35のうち、その後1 + 1 +1、その後、第一、及び+1の下で、+ 1をソート.. +1 +3多く、その後、再び多くの。ちょっと待ってに精通していない何を1 + 1 + 1の前に!なぜ私たちもそれを覚えていません!だから、[]が来るDP!

それはモード0の可能な組み合わせのデフォルトNUMSアレイは次に1に設定されていることを意味し、DP [1、DP []配列が、それは最初、0が1である、長さが1の対象+ INTアレイであります]我々は一時的にまだ意味し、-1に設定することを一連の要素を計算します。このように、トップダウンからの動的プログラミングは、私たちが小さなターゲットを解決するに分解巨大なターゲットを解決する、この小さなターゲットが小さいターゲットを解決するに細分されます解決するために、出てきました。終了時まで、その過程で、私たちは目標を解決しなければならないが、配列DPに保存されています!だから、終わりを解決するために、我々はないでしょう、それ上のアレイを呼び出されました!コンピューティング少しだけ!コードは以下の通りであります:

1  プライベート INT combinationSum4_dp(INT [] NUMS、int型のターゲット){
 2          DP = 新しい新しい INT [+ターゲット1。];
 3          Arrays.fill(DP、-1 );
 4          DP [0] = 1 ;
 5          リターンヘルパー(NUMS、ターゲット);
 6  }
 。7  
。8  プライベート int型ヘルパー(INT [] NUMS、int型のターゲット){
 9          / ** 
10           目標DP *到着レコードインデックスが解決するいくつかの解決策があることを示し
 11           *は、その中間結果を覚えておくことと等価です!12           * /
13          であれば(DP [ターゲット] = -1!){
 14              リターンDP [ターゲット]。
15          }
 16件         のint RES = 0 17          のためにINT I 0 =; I <nums.length; I ++ ){
 18が             あれば(ターゲット> = NUMS [I]){
 19の                  RES + =ヘルパー(NUMS、標的- NUMS [I])。
20              }
 21          }
 22          DP [ターゲット] = RES。
23          リターンのres;
24 }

明確さの多くはありませんが、我々は、最初の組み合わせの小さいターゲット番号を持っていたし、その後、大きな大きなまで行くことにします。だから、最後に、私たちは、一見大きなターゲットを解決しました。ダイナミックのアイデアは、それをプログラミングされていないこと!

だから、将来的には、最初の大きな課題の間で、共通のを見つけなければならないし、特性の小さな問題は、特定の状態遷移ルールを列挙され、次いで溶液の条件を満たすように小さな問題を設計し、そして最後に、メモリ内の中間値迅速最終的な解決策を得ます!

もちろん、動的プログラミングの問題が多く、フォローアップ進行中であり続けます。

おすすめ

転載: www.cnblogs.com/lybnumber6/p/12158901.html