あなたは魔法を震えるようにする[]動的なプログラミングアルゴリズム:動的プログラミングの基礎

  ダイナミックプログラミングは、苦いアルゴリズムを理解することは素晴らしいが、難しい、白頭痛の数は、システムのこの種の基礎は、動的プログラミングの小さなシリーズとなります。

▎動的計画は何ですか?

まず、概念が導入され、

  歴史1)動的プログラミング:動的なプログラミングは最初の数学の分野で使用された、最も一般的には1950年代初期におけるオペレーショナルリサーチの使用があり、研究の数学者REBellman多段階で、米国およびその他の意思決定プロセスを最適化問題は、最適の有名な原則を提唱したとき。

  2)今、質問の導入を検討してください。

  少なくともn型コインと働きかけ方法1元、2元及び5元金貨の数の額面を有しますか?

  まず第一に、私たちは大きな5元コイン宗派(貪欲な考え方)を考えるだろう、それは5元硬貨の使用を優先して、$ 2を使用します$ 1、最終的な、私たちは食べ物を買うために市場という考えと一致しています、私は間違っていませんでしたが、コイン宗派は、それを変更した場合?次の質問を再考:

  少なくともn型コインと働きかけどのように$ 1、$ 5 $ 7元金貨の数、の額面をお持ちですか?

  それでは、どのようにこれを行うには?また、それだけの考えと?明らかではない、例えば、我々はあなたがちょうど7元* 1 * 4 + 1元、5枚のコインの合計をメソッドを使用する必要がある場合は、$ 11 Couchuしたいのですが、実際には3枚のコイン($ 5 * 2 + 1ドル*を必要とします1)、毎回選挙は最小限ですが、問題全体が最適であることを保証することはできませんだけで、現在のコインことを確保するための最適な方法ではないようです。その後、我々は自然に検索暴力を考えるだろうが、検索の時間計算量はnが大きい場合、アルゴリズムは、我々のニーズを満たしていないだろう、と我々は、動的プログラミングを行う必要があり、指数関数的にしばしばです。

動的計画法の第二に、自然

  1)分析するために継続

  が、明らかに最後の1は$ 1、$ 5となることがありかもしれ:動的なプログラミングは、我々は、この選択のプロセス全体について慎重に検討する必要はありませんどのような種類だと思います最後の硬貨の最初ではない複雑な想像力であります7員、コイン港の、必要な数であるn個のコインが港であってもよい+1、N-1要素(1ドル硬貨を加えたもの)、数がハッシュであってもよい+1 N-5員硬貨(1 5元金貨)は、それがコイン+ 1 N-7員の数(7元硬貨)に参加することができます。N-7元、あなたが知っているコインの枚数を収集し、問題は非常に複雑であると思われ、ここを参照してくださいは、一緒のn-こすりであることが判明したが、今、彼らはただ一緒のn-1ドル硬貨の数をこすりするために知って、数のn-5元のコインを収集しましたコインの港n進数。元のハッシュNコインサイズがNである場合、今対処すべき問題の大きさは、N-1、N-5であり、 N-7、 ダイナミックプログラミングの本質であり、問題の規模を減少させますそして、あなたが依頼する必要があります、誰がそれを見ることができ、その後、こすり合わせてn-1個の1ドル硬貨の数を計算する方法コインのN-7元番号、収集した数のn-5元のコインを収集しましたか?これは、再帰的プロセス(再帰的に再帰的に良い理解を達成することができます)で、例えば、我々は質問港区のn-1に加工ケアのn金貨を取る必要があり、N-5の問題を、N-7、我々は、することができますN-1、N-5、 N-7は、 大きさの視界の外に縮小されるまで、我々は戻って再帰では、子供のこの質問に対する答えを得ることができ、n個のサイズが減少し続けました。図に明らかになっていないテキストは、それを示しています。

  

  粗塗装技術の小さなシリーズを許す限り、各サブ対照として、それすると、ワンバックずつ次に、我々は肉眼で見ることができる港1,2,3,4,5,6,7コイン、境界条件として使用することができます値問題、最小の(質問は以上のコインを使用して言うので)、あなたが選択した元の問題の解決策を得ることができます。実際には、暴力によって最適化されたような動的プログラミングアルゴリズムを理解することができる暴力は、多くの場合、アルゴリズムの時間計算量は、非常に高くなり、私たちのニーズを満たすことはできませんが、暴力アルゴリズム冗長ダブルカウントがたくさんあるでしょう、それはまた、動的プログラミングの本質であるので、冗長な計算を削除、また大きさを減少させるために使用することができ、上記問題の硬貨のように、最適化し続けることができ、それは後述します。

  2)要約すると:動的なプログラミングは小さな問題に大きな問題であり、その後、小さな問題を打破する問題の大きさを減らす、いくつかの冗長な計算を削除し続けています。

  3)用語の概要:サブ問題 - それは小さな問題にそれぞれの問題を意味し、元の質問に、これらのマイナーな問題を、それが親子関係の問題や問題です。

第三に、3の性質

   1)オーバーラップする部分問題

  重複サブ質問はを参照元の質問にサブ問題の各分解同一または類似しているあなたは、時間の複雑さを軽減することができますので、問題は、できるだけ元のサブ問題を呼び出すことの結果であることができますので、。問題は、サブ同一または類似の間にない場合は、動的なプログラミングはその意味を失い、時間の複雑さはありません、それとの通常の戦いの暴力など、想像することができます。

  2)最適なサブ構造

  最適なサブ構造は、ということであることを意味し、問題の最適解は、子供がいる元の問題の最適解、例えば、私は今、一緒に$ 11こすりしたい、その後、5元コインの作品のこすり合わせて$ 6 + 1コインの数が一緒に$ 11こすりすることです最適な下位問題、前記最適な下位問題:港6員プログラム($ 5ドル* 1 * 1 + 1)+コインの1個は、5元である元の問題:$ 11スキーム港($ 5 * 2 + 1元* 1)ソリューション。

  3)無アフターエフェクト

  後の効果はありません、既に決定された子の問題の解決策は、他の要因のさらなる変化はありません、私はすでに6元は2枚のコインを必要と一緒にこすり、あなたは変更されません、7ためで参加していないことを知っているような、元、港区8、変更などの9元港区、まだ2枚のコイン。

  同時に、私たちはもはや6ドル硬貨を気にしないだろうが、の世話をしない方法で具体的には、関係なく、どのように卑劣な方法、要するに、我々は6元のコインが2枚のコインで作られていることを知って作る我々は悪質な手段を使用してどのようにこれらの2コインの額面は、我々は介入しません


  後で、我々は問題が発生した際に、動的プログラミングの問題を判断することはできませんこれを知ることは、この質問には満足している場合、あなたは、動的プログラミングので安心することができ、それは3つのプロパティを満たしているかどうかを決定することができます。

 

▎状態転送

  実現)動的計画法の1つの形式:再帰と再帰:ダイナミックプログラミングの最適化は、それが一般的にダイナミックプログラミングの形で実現され、単に思想ではなく、クラスコードです。(最初の再帰的実装しました)

  2)状態&デザインステータス:状態は困難である、小さなシリーズを含む白()の多くは、しばしば混乱しての罪を犯している、デザインの正しい状態の質問への鍵は、ソリューションです。動的プログラミングのアレイの定義が使用される状態は、それが配列の保存されたものであり、理解することができますか?これは、設計プロセスの状態として理解することができ、設計が必要です。この一次元アレイは、以下の表に配置されている複数の寸法を設計することができる情報の一部を示しています。[i]を表すfはちょうどコインとして、我々は、F []配列を定義することができ、それが何を意味するのでしょうか?私ははい、状態は良いデザインを持って、それは十分に簡単ですが、多くの州の質問はそう簡単ではありません、[i]のコインコインがFを必要と一緒にこすりすると述べました。

  3)転送及び状態遷移方程式:デザインは良い状態であり、私たちはそれぞれの状態との関係を考える必要があり、その後、二つの方向がある:1. 私はから来た(再帰が、これは頻繁に使用される、)再発が可能と思われる、2 。どこに行くのですか(再発)。例えば、ちょうどF、問題をコイン[11]明らかにすることができるF [4]、F [6 ]、F [10] Fコースの小さいリフレッシュその値(Iが来る)、IN [11]また、F、F [12]をリフレッシュするために使用することができます[16 ]、F [18] の値(私は行く)、リフレッシュ処理が呼び出される転移、我々は間違いなく後に、主に私と一緒に来もちろん、私たちは常に思考のこのラインを使用します。Fは、N- [] =分:ちょうどコインの問題は、以下の式を導出することができるがあり
{[5-N-] Fは[N - 1] + 1、F + 1、F [7-N-]} + +1、など方程式は、と呼ばれる状態遷移方程式を形成理解されるように、状態と状態間のブリッジ状態が正しいデザインが取得する状態遷移方程式が簡単になります。

 

▎メモリアレイ再帰検索VS

  1)メモリ検索

  ただ、戦術コイン問題は最適でない、あるいは実際に動的計画はない、それだけで普通の再帰とみなすことができます。その後、彼らはメモリの手段の使用、それが何であるかの後、メモリを最適化するのでしょうか?そのメモリは、すでに保存さ良い値と考えられています。

  なぜそれのメモリ必要がありますか?栗の場合:また、Fの計算Fを呼び出し中にコインや問題、例えば、私はFを呼び出したい計算されている[18] F一度[13]、[13] [20]とき、[13] F上サイズが小さい場合、我々はこれらの良い結果の計算を繰り返す場合は、結果を得るが、大規模なアップと、スピードが想像することができますすぐに、その後、ダブルカウント、ダブルカウントのサブ問題だった、その後、保存されていますそれは、再呼び出し、結果を直接することはできませんまでの時間ですか?

  再帰の2)配列

  この実装は、具体的に従うべき、と考えるのダブルカウントの場合は表示されませんが、また、関数を呼び出すを避けるためにではなく。

  3)の比較

  メモリ検索は本当に良い達成したいが、時間をかけて必要な計算時間の関数呼び出しのほかにあるでしょう、そう遅くなる時、達成することは簡単です。

 

▎コイン問題:達成するためのメモリを検索

1つの#include <iostreamの>
 2  使用して 名前空間STD;
 3  INT N-、F [ 1000 ]、A [ 1000 ]; // 設計条件
。4  INT COIN(int型I)を
 5  {
 6。     IF(A [I] =!0リターン [I]; // 直接カウント返した場合
7。     IF(== I 1。 リターン 1。;
 。8       IF(I == 2リターン 2 ;
 9       IF(I == 3リターン 3 10      他の 場合(I == 4復帰 4 11      他の 場合(I == 5リターン 1 12      他の 場合(I == 6リターン 2 13      他の 場合(I == 7リターン 3 14      F [I] =分(コイン(I- 1)+ 1、分(コイン(I- 5)+ 1、コイン(I- 7)+ 1)); // 状態遷移方程式
15      リターン A [I] = F [I]; // 非常に良い値メモリ割引
16  }
 。17  INT メイン()
 18である {
 19。      CIN >> N-、
 20は      COUT < < COIN(N)
 21である     戻り 0 ;
 22れます }

 

詳細な問題▎

  上記の単純なコインの問題を読んだ後、次のステップは、超厄介な問題を確認するために、ADO、あなたの心の状態について展開しています。


 

山小学校を建て

説明[タイトル]

政府在某山区修建了一条道路,恰好穿越总共m个村庄的每个村庄一次,没有回路或交叉,任意两个村庄只能通过这条路来往。已知任意两个相邻的村庄之间的距离为di(为正整数),其中,0<i<m。为了提高山区的文化素质,政府又决定从m个村中选择n个村建小学(设0<nm<500)。请根据给定的m、n以及所有相邻村庄的距离,选择在哪些村庄建小学,才使得所有村到最近小学的距离总和最小,计算最小值。

【输入】

第1行为m和n,其间用空格间隔

第2行为m1 个整数,依次表示从一端到另一端的相邻村庄的距离,整数之间以空格间隔。

例如:

 

10 3
2 4 6 5 2 4 3 1 3

 

表示在10个村庄建3所学校。第1个村庄与第2个村庄距离为2,第2个村庄与第3个村庄距离为4,第3个村庄与第4个村庄距离为6,...,第9个村庄到第10个村庄的距离为3。

 

【输出】

各村庄到最近学校的距离之和的最小值。

【输入样例】

10 2
3 1 3 1 1 1 1 1 3

【输出样例】

18

【来源】


No

这道题太麻烦,感觉写到一篇博客里慌得不行。

发一下之前小编写过的题解:山区建小学

おすすめ

転載: www.cnblogs.com/TFLS-gzr/p/10962216.html