备忘录方法与动态规划比较
?動態規劃算法的基本要素:?
1? 最優子結構性質
當問題的最優解包含了其子問題的最優解時,稱該問題具有最優子結構性質。
2? 重疊子問題性質???
動態規劃算法對每個問題只解一次,將其解保存在一個表格中,當再次需要解此問題時,用常數時間查看一下結果。因此,用動態規劃算法通常只需要多項式時間。
備忘錄方法:
?用一個表格來保存已解決的子問題的答案,用的時候查表即可。?
?采用的遞歸方式是自頂向下。
?控制結構與直接遞歸相同,區別在于備忘錄方式為每個解過的子問題建立備忘錄。?
?初始化為每個子問題的記錄存入一個特殊的值,表示并未求解。在求解過程中,查看相應記錄如果是特殊值,表示未求解,否則只要取出該子問題的解答即可。
備忘錄方法與動態規劃和遞歸的區別:
1、動態規劃是自低向上 ,備忘錄方法是自頂向下,遞歸是自頂向下
2、動態規劃每個子問題都要解一次,但不會求解重復子問題;備忘錄方法只解哪些確實需要解的子問題;遞歸方法每個子問題都要解一次,包括重復子問題??。
動態規劃解矩陣連乘問題
#include<iostream>
using namespace std;
void metrixchain(int n,int p[],int **s,int **m)
{
?for(int i=0;i<n;i++)
? m[i][i]=0;
?for(i=2;i<=n;i++)??? //小于等于n
?{
? for(int j=0;j<n-i+1;j++) //橫坐標
? { int k=j+i-1;?? //縱坐標
? m[j][k]=m[j+1][k]+p[j]*p[k+1]*p[j+1];s[j][k]=j;
? for(int t=j+1;t<k;t++)
? {
?? int u=m[j][t]+m[t+1][k]+p[j]*p[t+1]*p[k+1];
?? if(u<m[j][k])
?? {
??? m[j][k]=u;s[j][k]=t;
?? }
? }
? }
?}
}
void Traceback(int i, int j, int ** s)
{
?if (i==j||i==j-1) return;
?cout<<"divide after metrix "<<s[i][j]<<endl;
?Traceback(i, s[i][j],? s);
?Traceback(s[i][j]+1,j ,? s);
}
int main()
{
?int p[]={30,35,15,5,10,20,25};
?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++)
?{ for( int j=i;j<6;j++)
?cout<<m[i][j]<<" ";
?cout<<endl;
?}
?Traceback(0,5,s);
?return 0;
}
總結
以上是生活随笔為你收集整理的备忘录方法与动态规划比较的全部內容,希望文章能夠幫你解決所遇到的問題。