動態規劃的基本思想是,將原問題拆分為若干子問題,自底向上的求解。其總是充分利用重疊子問題,即通過每個子問題只解一次,把解儲存在乙個表中,巧妙的避免了子問題的重複求解。
遞迴方法,採用的是自頂向下的思想,拆分為若干子問題,但是造成了子問題的重複求解。
備忘錄方法,採用的也是自頂向下的思想,但是該方法維護了乙個記錄子問題解的表,雖然填表動作的控制結構更像遞迴方法,但是的確避免了子問題的重複求解。
下面以字串的相似度來展示一下各方法的特點:
動態規劃
遞迴:略
備忘錄:
[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 重疊子問題性質 動態規劃演算法對每個問題只解一次,將其解儲存在乙個 中,當再次需要解此問題時,用常數時間檢視一下結果。因此,用動態規劃演算法通常只需要多項式時間。備忘錄方法 用乙個 ...