動態規劃 備忘錄方法 遞迴方法

2021-07-06 06:43:08 字數 2841 閱讀 5081

動態規劃的基本思想是,將原問題拆分為若干子問題,自底向上的求解。其總是充分利用重疊子問題,即通過每個子問題只解一次,把解儲存在乙個表中,巧妙的避免了子問題的重複求解。

遞迴方法,採用的是自頂向下的思想,拆分為若干子問題,但是造成了子問題的重複求解。

備忘錄方法,採用的也是自頂向下的思想,但是該方法維護了乙個記錄子問題解的表,雖然填表動作的控制結構更像遞迴方法,但是的確避免了子問題的重複求解。

下面以字串的相似度來展示一下各方法的特點:

動態規劃

遞迴:略

備忘錄:

[cpp]view plain

copy

#include 

#include 

#include 

using

namespace

std;  

const

intn = 100;  

intdist[n][n];  

intminvalue(

intva, 

intvb, 

intvc)  

intdistance(string stra, 

intpabegin, 

intpaend, string strb, 

intpbbegin, 

intpbend)  

if(pbbegin > pbend)  

if(stra[pabegin]==strb[pbbegin])  

else

}  intmain()    

當n=0時,f(n) = 0     

當n=1時,f(n) = 1

當n>1時,f(n) = f(n-1) + f(n-2)

遞迴演算法:

[cpp]view plain

copy

intfun(

intn)    

備忘錄方法:

[cpp]view plain

copy

#include 

using

namespace

std;  

const

intn = 100;  

intf[n];  

intfun(

intn)  

if(n == 1)  

coutreturn

f[n];  

}  int

main()    

由於計算的時候只需要前兩個數即可,所以**還可以繼續優化。但是對於上述的備忘錄方法貌似不能繼續進行空間優化了(不知道對否,如果理解的不對請不吝賜教~)。

但是對於下面的方法(就稱為遍歷方法吧),還是可以繼續優化的。

[cpp]view plain

copy

#include 

using

namespace

std;  

const

intn = 100;  

intf[n];  

intmain()  

cout<

return

0;  

}  

由於計算的時候只用了前兩個數,所以沒有必要使用陣列。

[cpp]view plain

copy

#include 

using

namespace

std;  

intmain()  

}  cout<

return

0;  

}  

總結:從**中可以看出來,遍歷方法實際上是一種自底向上的方法,而備忘錄方法是一種自頂向下的方法,也許正由於這個原因造成了備忘錄方法無法進行空間優化。(待證)

動態規劃演算法的基本要素:

1  最優子結構性質

當問題的最優解包含了其子問題的最優解時,稱該問題具有最優子結構性質。

2  重疊子問題性質   

動態規劃演算法對每個問題只解一次,將其解儲存在乙個**中,當再次需要解此問題時,用常數時間檢視一下結果。因此,用動態規劃演算法通常只需要多項式時間。

備忘錄方法:

•用乙個**來儲存已解決的子問題的答案,用的時候查表即可。 

•採用的遞迴方式是自頂向下。

•控制結構與直接遞迴相同,區別在於備忘錄方式為每個解過的子問題建立備忘錄。 

•初始化為每個子問題的記錄存入乙個特殊的值,表示並未求解。在求解過程中,檢視相應記錄如果是特殊值,表示未求解,否則只要取出該子問題的解答即可。

備忘錄方法與動態規劃和遞迴的區別:

1、動態規劃是自低向上 ,備忘錄方法是自頂向下,遞迴是自頂向下

2、動態規劃每個子問題都要解一次,但不會求解重複子問題;備忘錄方法只解哪些確實需要解的子問題;遞迴方法每個子問題都要解一次,包括重複子問題•

。動態規劃解矩陣連乘問題

#include

using namespace std;

void metrixchain(int n,int p,int **s,int **m)

;int **s=new int*[6];

for(int i=0;i<6;i++)

s[i]=new int[6];

int **m=new int*[6];

for( i=0;i<6;i++)

m[i]=new int[6];

metrixchain(6,p,s,m);

for( i=0;i<6;i++)

備忘錄方法與動態規劃比較

動態規劃演算法的基本要素 1 最優子結構性質 當問題的最優解包含了其子問題的最優解時,稱該問題具有最優子結構性質。2 重疊子問題性質 動態規劃演算法對每個問題只解一次,將其解儲存在乙個 中,當再次需要解此問題時,用常數時間檢視一下結果。因此,用動態規劃演算法通常只需要多項式時間。備忘錄方法 用乙個 ...

備忘錄方法與動態規劃比較

動態規劃演算法的基本要素 1 最優子結構性質 當問題的最優解包含了其子問題的最優解時,稱該問題具有最優子結構性質。2 重疊子問題性質 動態規劃演算法對每個問題只解一次,將其解儲存在乙個 中,當再次需要解此問題時,用常數時間檢視一下結果。因此,用動態規劃演算法通常只需要多項式時間。備忘錄方法 用乙個 ...

備忘錄方法與動態規劃比較

動態規劃演算法的基本要素 1 最優子結構性質 當問題的最優解包含了其子問題的最優解時,稱該問題具有最優子結構性質。2 重疊子問題性質 動態規劃演算法對每個問題只解一次,將其解儲存在乙個 中,當再次需要解此問題時,用常數時間檢視一下結果。因此,用動態規劃演算法通常只需要多項式時間。備忘錄方法 用乙個 ...