アルゴリズムの紹介は最近、見少し動的なプログラミングを勉強し始めている、以下の被験者が最初の動的プログラミングの知識の最近の記録を見て始めたまっすぐに始めました。ダイナミックプログラミングはゴールデン問題が階段を登る言及しなければならない持ち上げ、キングゴールド、いくつかのナップザック問題動的計画。今日階段自習室を登るために最も簡単な問題を研究。
列子Q:階段の10のステップの高さは、すべての時間帯は、一歩まで、下から上しかないステップやプログラム、アルゴリズムの合計数を模索するために必要な2つのステップがされて行きますか?
質問:横切る毎に二つの工程と比較した場合、すべての時間スパンが、このように、レベル1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1 + 1と比較すると2 + 2 + 2 + 2 + 2 + 2 ......様々なたくさんの、最も簡単な方法は、すべての可能な方法再帰呼び出しの出力のより多くの暴力的なサイクルを書くことですが、少なくとも効率的なとき、指数の増分に対するこのアプローチの時間複雑。今、私たちはこの問題を考えるために、動的プログラミングのアイデアの使用を検討し始めた、動的なプログラミングのアイデアは、問題を分割し分割し、征服することです。最初の質問は最後のステップを実行するために階段登りを検討するために、そして唯一のステップは、この時点では9日のステージから階段ステップは、ステージを横切って10から到達するために、可能性の2つだけありますしてください、このセクションの問題の終わりになるでしょう二つのステップ10の順序全体で8次到着時間。方法の第9工程の方法は、タイプBの8段目に到達する種は10次の方法に到達していると仮定すると、OK、我々は方法の工程と略記この時間は10°F(10)であり、+ bのました、F(10)= F(9 )+ F(8) とは、同じ方法F(9)= F(8分割し続ける (7)、F(8)= F(7)+ F()+ Fを6)において、最後のステップは、最初の分割すると二次1は定数F(1)= 1、Fを取得することは容易である (2)= 2 となる式を得ること。
F(N)= F(N-1)+ F(N-2)(N> = 3)
今回は、動的プログラミング概念Fを用いて得た(9)およびF(8)であり、最適な基礎構造F(10)(1)= 1、F(2)= 2、いわゆる動的計画で、Fであります境界問題、及び上記で得られた式は、状態遷移方程式であります
まあ、今ではほとんど整理私たちの思考、今まで問題を解決する方法について考え始めるために、コードを使用すると、Javaで書かれました
方法、
公共 INT getClimblingWays(int型N){ 場合(N <1)戻り 0 ; もし(N == 1)リターン 1 。 もし(N == 2)リターン 2 。 戻り getClimblingWays(N-1)+ getClimblingWays(N-2 )。 }
もちろん、この方法では、この問題を解決することができますが、我々はこれを考慮する必要があり、実行が計算を繰り返されないが、以下では、すべての計算ノードのチャートであるアルゴリズムの時間複雑バイナリツリー、過去に各ノードです計算が終わって計算されていても、我々はほぼ計算結果のキャッシュであることを覚えていることができますか?ここでは、第二の方法のリードを持っています
第二の方法、メモアルゴリズム
公共 INT getClimblingWaysWithCache(整数 nは、地図<整数、整数> マップ){ 場合(N <1)戻り 0 ; もし(N == 1)リターン 1 。 もし(N == 2)リターン 2 。 もし(map.containsKey(N)){ 戻りmap.get(N) } 他{ int型のval = getClimblingWaysWithCache(N-1、マップ)+ getClimblingWaysWithCache(N-2 、マップ) map.put(N、ヴァル)。 返すのvalを。 } }
これは大幅に毛の時間複雑度と空間複雑度はO(N)であり、アルゴリズムの時間複雑さを低減します
これまで我々は、我々が示すように、ボトムアップ方式にトップダウンせずに我々のアプローチについて考え始めるする必要が終わりになっていません。
散歩の各ステップと、最初の2つのステップの数がすべて3のステップの数よりも大きい後、溶液は、各サブセットを覚えておく必要はありませんのために私たちは、あなたが最初の2つだけを覚えておく必要があり、新しい方法を最適化することができます解決方法は同様であるので、我々は第三の方法を紹介しました
方法3、動的プログラミング溶液
公共 INT getClimblingWays3(int型N){ 場合(N <1)戻り 0 ; もし(N == 1)リターン 1 。 もし(N == 2)リターン 2 。 int型の A = 1 ; INT B = 2 。 int型の温度= 0 ; 以下のために(int型 I = 3; iが++; iが<= N ){ TEMP = B + 。= B; B = TEMP。 } 戻り温度; }
IのみI = N F(N)> = 3最初から最後まで= 3プログラム、それがループに入りました。さて、これまで最も簡単な動的なプログラミングの問題はすべて、より良い整理します。