ダイナミック理論のプログラミング:あなたは徹底的に最適なサブ構造を知ってもらうとともに、物品、ノー後遺症と繰り返し質問
問題はどのような動的計画法によって解決することができますか?一般的には、動的なプログラミングの問題を解決するためのプロセスは何であると思いましたか?
三つの特徴を説明する理論モデル
ダイナミックは、それに従うことをルール何の問題を解決するためのプログラミング?「モデル特徴3」としてまとめ
モデル:この問題を解決するための動的プログラミング・モデルは、モデルは以下のように定義された「マルチステージ決定の最適なソリューション。」
ダイナミックプログラミングの最適化問題を解決するため、複数の段階を通過する問題解決、意思決定の必要性、各状態の意思決定ステージのセットに対応し、その後集団決定シーケンスを探し、集団決定配列その後、最終的な所望の解決を製造するための一般的な方法最適なソリューション
三つの特徴:最適なサブ構造、およびなしを繰り返した後の部分問題
1、最適な下部
最適なソリューションは、即ち、状態は状態前段介して後段に由来することができ、問題のサブ最適溶液を含みます
2.ノー後の効果
状態は唯一の前段の値に関係するとき、我々は唯一の動的なプログラミングモデル前述の問題を満たすために、これは推測ステップバイステップであるかを気にしない、位相状態を導き出す、基本的には後の効果を満たしていません
3.を繰り返し、サブ問題
意思決定の異なるシーケンスは、重複した状態になることがあり、同じの特定の段階に達します
例の「モデル特徴3」の分析
N- *
、N行列W [n][n]
、右下のコーナーピース、各だけ右または下に移動する左上から移動するマトリックスのニーズに格納された正の整数であり、数字は、参照を介してパスを追加経路長を行い、右下に左上からの最短経路の長さはどのくらいですか?
1 3 5 9
1 2 3 4
5 2 6 7
6843(1は始点、終点3)
「モデル」かどうかの問題?
(0,0)から(N-1、N-1 )歩行の和2*(n-1)
工程、各ステージは、決定の右又は2種まで行かなければならない、状態の組に対応する各ステージは、状態はmin_distのように定義されます(i、j)は、iが行を示し、jは列を表し、min_dist(i、j)のように、これは多段決定され、(0,0)から(I、J)の発現の最短パス長の値を表します動的プログラミングのモデルに沿った最適なソリューション、
初期段階0:1
ステージ1:2または3
ステージ2:5または1または5
阶段3:6、または2または3または9
ステージ4:8または6または4
ステージ5:4または7
ステージ6:3
「三つの特徴」を満たしていますか?
再帰的ツリーの絵を見ては、そのようなコードを書くように、この問題を解決するためのアルゴリズムを再帰的ツリーが重複ノードを有し、ノードは種々の経路に対応する左上のノードから繰り返し位置を表し見出さバックトラック、問題は副問題を繰り返した説明
この位置に移動します(i、j)は、必要唯一の懸念(I-1、j)は、(i、j-1)の二つの位置の状態に対応し、作品は、これら二つの位置にどのような経路で気にしませんこの機能の無い後の効果に沿って
最適サブ構造と一致する二つの状態を導出するmin_dist(i、j)はmin_distにより(I、J-1)とmin_dist(I-1、j)は
2つの動的プログラミング問題解決のアイデアの概要
ダイナミックプログラミングの問題を解決するために、一般に二つのアイデア、状態遷移表法と状態遷移方程式法を持っています
1.状態遷移表法
動的なプログラミングの問題は、ブルートフォース検索によって解決することができ、我々は以前に、単純なバックトラッキングアルゴリズムの状態を定義解決の問題を取得するときに解決するためのアルゴリズムをバックトラックに使用することができ、各状態は、ノードを表しているかどうかを確認するために再帰的なツリーを描きますあなたが解決するために、動的プログラミングを使用することができるかどうかを確認するために法律を見つけるために、サブ問題を繰り返し
重複したサブ問題を発見した後、サブ問題の重複を回避するために2つのアイデア一直接バックプラス「覚書」があり、第二は、動的プログラミングソリューションの使用で、状態遷移テーブル方式
状態遷移表の方法であって、第1の状態テーブルを描く、概して二次元の表、意思決定プロセスに三つの変数、行、列、アレイ値、記載を含む各状態有し、前面から背面に、各充填段階であります動的プログラミングコードであるコードに変換フォームを記入の状態、この再帰的プロセス、
ほとんどの状態テーブルは、2次元ではあるが、状態の問題はより複雑な場合は、対応する状態テーブルを表現するために多くの変数が必要ですが、おそらく高い次元である、それは状態遷移表の方法には適していません
最短経路行列の前に問題を解決するために、この状態遷移表の方法を適用する方法?
スタートからフィニッシュまで、最短の移動を見つけるために比較して、すべての可能な動きを徹底的に多くの異なった動き、存在し、どのように我々は、すべての動きのミス網羅するものではない繰り返すことはできませんか?バックトラッキングアルゴリズムとの定期的な徹底的なアルゴリズム:
private int minDist = Integer.MAX_VALUE; //全局变量或者成员变量
//调用方式:minDistBacktracing(0,0,0,w,n):
public void minDistBT(int i ,int j,int dist,int[][] w ,int n){
//到达了n-1,n-1这个位置
if(i == n && j == n){
if(dist < minDist) minDist = dist;
return;
}
if(i < n ){ //往下走,更新i = i+1;j=j
minDistBT(i + 1,dist+w[i][j],w,n);
}
if(j<n){ // 往右走,更新i=i, j = j +1
minDistBT(i,j+1,dist+w[i][j],w,n);
}
}
(I、J、DIST)を繰り返したが、(i、j)はされていないにも関わらず、コードバックを使用すると、再帰的なツリーを描かれた、サブ問題、(I、J、DIST)を含む3つの状態変数を見つけるために繰り返されますそこ重複の多くは、(i、j)を繰り返しノードのために、ある、最小のノードDISTを選択し、再帰的なソリューションを継続、他のノードはあきらめます
あなたは、動的なプログラミングエリアを解決するために使用することができますか?
二次元の状態テーブルを描き、作品は、行と列の代表であった、値が位置に原点からの最短経路を表します
初期化行0、列0
1 4 9 18
3 * * * 第一行:min(3+1,4+1) min(4+3,9+3) min(7+4,18+4)
8 * * * 第二行:min(8+2,4+2) min(6+6,7+6) min(12+7,11+7)
14 * * * 第三行:min(14+8,6+8) min(14+4,12+4) min(16+3,18+3)
だから、コードは次のとおりです。
public int minDistDP(int[][] matrix , int n ){
int[][] states = new int[n][n];
int sum = 0 ;
for(int j = 0 ; j < n ; ++j){ //初始化states的第一行数据
sum += matrix[0][j];
states[0][j] = sum;
}
sum = 0;
for(int i = 0 ; i < n ; ++i){ //初始化states的第一列数据
sum += matrix[i][0];
states[i][0] = sum;
}
for(int i = 1;i < n ;++i){
for(int j = 1 ; j < n ; ++j){
states[i][j] = matrix[i][j] +Math.min(states[i][j-1],states[i-1][j]);
}
}
return states[n-1][n-1];
}
2.方法状態遷移方程式
問題は、最適な下部構造は、最適な下部構造によれば、式で、状態遷移方程式こと再帰式を書くことが再帰的に副問題によって解決方法を分析する必要があり、コードは簡単であり、一つは、再帰的備忘録+です反復再帰
再帰方程式はあります。
最初:コードに変換再帰方程式+メモ
private int[][] matrix = {{1,3,5,9},{2,1,3,4},{5,2,6,7},{6,8,4,3}};
private int n = 4;
private int[][] mem = new int[4][4];
public int minDist(int i , int j){ //调用minDist(n-1,n-1)
if( i == 0 && j == 0) return matrix[0][0]
if(mem[i][j] > 0) return mem[i][j];
int minLeft = Integer.MAX_VALUE;
if(j-1 >= 0 ){
minLeft = minDist(i,j-1);
}
int minUp = Integer.MAX_VALUE;
if(i-1 >= 0){
minUp = minDist(i-1,j);
}
int currMinDist = matrix[i][j] + Math.min(minLeft,minUp);
mem[i][j] = currMinDist;
return currMinDist;
}
4つのアルゴリズムの比較は思いました
貪欲、差異および分割統治、バックトラックとダイナミック・プログラミングの間のリンク
貪欲、バックトラックは、動的プログラミングはクラスに分割され、別々のカテゴリにパーティションは、問題を解決するための最初の三つのモデルアルゴリズムは、問題を解決するために多段決定最適溶液、分割統治アルゴリズムに抽象化することが可能であっても、それらのほとんどけれどもこれは、最適なソリューションですが、それは多段階の意思決定モデルに抽象化することはできません
コイン変動問題
そこ元wが支払われるコインのV1、(ドル単位)V2、......、VN、いくつかの異なる宗派があり、必要なコインの最小数を必要とし、例えば、我々は、3枚の異なるコインを持って、1¥、3¥、5 ¥は、我々は$ 9コインを支払う必要が3(3元硬貨の3)の最小値が必要です
問題は、ステップ1,3,5に分割することができるように登る梯子を見ることができ、図9は、ステップの最小値に来る方法を動的移動式f(9)= 1 +分(F(8)、F(6)、F(4))
即F(N)= 1 +分(F(N-1)、F(N-3)、F(N-5))