私は長い間見て、この問題は、動的プログラミングはああのように見えますが、貪欲な試験問題は、または貪欲溶液でそれを考えるところがあることがわかりました。
後(ギャングのアイデアを学ぶ)非常に複雑な思考の後、最終的にこの問題を考えて貪欲を理解します。問題の主な難しさは、最終的にどの湖で停止することができ、かつ、湖での釣りの効率が少なくなります戻ることはできません。従来の考え方は、「静的に移動するの」、ダイナミック未知数の多くの主題、我々は唯一の角度を置き換える、十分ではないように思わ:
さて、最後は私が湖で停止しているかわからないということ、議論が聖歌分類されます。各湖の最適解のストップは、最終的な最適解を取るために、すべてを取得し、まだラインではないのですか?私たちは、私たちが知っているとき、主人公は最終的に、たとえば(これは湖の後、彼女のパスを一意に識別します停止していることを見つけ、アリソンは、最終的には、i番目の湖で停止し、彼女のパスでなければなりません1 - 「2 - 」3 - 」.. .-「I)、合計アイドル時間マイナスの移動時間によって、彼女の純粋な釣り時間が一意に決定されます。これは釣り5分から湖を考慮し、3-パス1-「2-」に相当します。 " 。。-ヒープ「「内のノードIの」5分間の湖とキャッチ魚にマークを表し、明らかに貪欲な戦略は、ここまでのところで、湖の釣りの最大数、および現在のレコードをマークし、5分ごとに提供されています答えはSUMで、私は + =湖と釣りで魚の数。最後に、すべてのSUM比較Iラインの最大出力を取って(I = 1,2、...、N-)を。
まだ理解していませんか?おそらく、コードを見てみると、ACを理解します:
1つの#include <iostreamの> 2の#include <cstdioを> 3。の#include <CCTYPE> 4。の#include <ベクトル> 5。 使用した 名前空間STD; 6 7。 INT ANS; 8 。9ベクトル< 整数 > FISH、lesss、T; // 各魚の数の数は、湖の最初の5分の数を減らす釣りの前の5分間にわたって5分ごとには、このような質問の意味として、各釣り湖、魚をキャッチすることができます 10ベクトル< int型 > GET、tmpfish; // 最初から時間はそれぞれ現在の5分の湖、湖を必要と湖は、i番目の入った魚の数をキャッチすることができます 11。 12で 文字CH; 13は、 14インラインint型の読み取り()// 速い読み取り(も読ん最適化と呼ばれます) 15 { 16の ANS = 0 ; 17 CH = GETCHAR(); 18であり 、一方 CH =(isdigit(CH)!)GETCHAR(); 19 ながら(isdigit(CH))= ANS(ANS << 3)+(ANS << 1)+ CH-、' 0 '、CH = GETCHAR(); 20は、 戻りANSを、 21である } 22は、 23であるインライン無効のinit()// 所望の動的配列インデックスが1から始まるように、初期のプロセスダイナミックアレイ 24 { 25 FISH。一back(0 ); 26は lesss.push_back(0); 27 t.push_back(0 ); 28 取得 .push_back(0 ); 29 取得 .push_back(0); // 配列プロセスは2とラベル付けされる主な機能から始まり得る注、複数を充填するために必要とされます0。 30 tmpfish.push_back(0 ); 31 } // なぜ0を埋めますか?共通グローバル配列が同じでの特性について(0に初期化さ完全に定義デフォルト) 32 33である INT (メイン) 34である { 35 )INIT(; 36 int型 N- =読む()、H =読む()* 12であり、 37 のために(INT = I 1。 ; I <= N; I ++)Fish.push_back(読む()); 38である ため(INT I = 1 ; I <= N; I ++の)lesss.push_back(読み取り()); 39 のために(INT I = 1 ; I <N - 、I ++は)T.一back(読み取り()); 40 のために(INT I = 2、Iは<= N-; I ++の)GET .push_back(GET [I- 1 ] + T [I- 1 ]); 41である INT Mava、麻浦、tmphours、matot = 0 ; // 現在の最大貪欲、貪欲た最大のインデックスに対応する電流を見つける(すなわち、湖の数)、漁網、現在の時刻、最終的な答え。 42である ため(INT I = 1; I <= N; I ++の)tmpfish.push_backは(0 ); 43である ため(int型 K = 1 ; K <= N; K ++ ) 44は、 IF(H> GET [K]) 45 { 46で tmphours = H- GET [K ]; // 利用可能な時間釣りネット 47 のための(int型 I = 1 ;私は= Kを<; I ++)はtmpfish [I] = FISH [I]は、// 初期化する 48 のint SUM = 0 ; //をアリソンを記録最後にk番目の回答で停止レイク電流 49 ながら(tmphours> 0 ) 50 { 51は Mava = - 2000000000. ; 52である 麻浦= 0 ; 53である ため(INT I = 1 ;私は= Kを<; Iは++)// 貪欲選択 54である IF(Mavaが< tmpfish [I]) 55 { 56は Mava = tmpfishは、[I]。 57は 麻浦= ; I 58 } 59 IF(Mava <= 0)BREAK ; // 直接出口をキャッチすることができない魚 60 SUM = +mava; 61 であれば(tmpfish [麻浦]> [麻浦] lesss)tmpfish [麻浦] - = lesss [麻浦]。 62 他 tmpfish [麻浦] = 0 ; 63 tmphours-- ; 64 } 65 であれば(和> matot)matot = 和。 66 } 67 他 破ります。 68 のprintf(" %dの" 、matot)。 69 リターン 0 ; 70 }
最後に、貪欲にそれを要約したものです。
あなたは問題が表示されたら、人生の経験によると:貪欲な戦略を決定し(面白い)勘貪欲な戦略のガイドラインを確認します。便利な簡単な質問に対処します。
基本的な貪欲関連する問題を有する(数式、またはタイトルに記載の生活関連アイテムと、いくつかの物理的特性によって誘導することができる)最大または最小のいくつかの局面を見つけなければならない性質と被写体関連見値。
証明貪欲戦略:直接の数学的導出。
よりよい解決策、これに反する証拠があるとします。
形而上学の占い
いくつかの貪欲注:局所最適解が立ち上げただけで最高の全体的なソリューション(戦略に限定されない)利用可能貪欲。(そうでない場合は、動的プログラミングを使用)
基本的な動的なプログラミングは貪欲んが、ダイナミック・プログラミングよりも優れて最も貪欲な複雑ことができます。