演算法描述:
已知多段圖的鄰接表,利用從後往前遞推的方法,先從最後一層往前保留當前的最短路徑長度,由子結構的最優解得到原問題的最優解。
遞推公式是:cost(i,j)=min
這裡為了節約空間,用一維陣列cost來儲存節點j到t的最短路徑長度。
將所有節點按0-n-1進行編號,源點s為0,匯點t為n-1;向前遞推由結點編號由大到小順序進行,先計算cost[n-1],最後得到cost[0]。cost[0]就是我們要的最短路徑長度。
源程式:
#include #define infty 0x7fffffff
using namespace std;
struct enode;
enode **a;
class graph
//多段圖的向前遞推演算法
int fm(int k,int p)
}cost[j]=min;
d[j]=q;
}p[0]=0;
p[k-1]=n-1;
c=cost[0];
for(j=1;j<=k-2;j++)
p[j]=d[p[j-1]];
return c;
} }; int main()
graph g(n,e);
c=g.fm(0,p);
cout演算法描述:
m陣列:計算矩陣連乘a(i,j)所需的最少數乘次數;
當i=j時,無需計算,m(i,j)=0;
當ipk+1pj+1}
最後要求的最優解的值就是m(0,n-1)
源程式:
#include using namespace std;
int p[20];
class matrixchain
//用一般動態規劃求最優解
int mchain()
matrixchain m(n);
x=m.mchain();
cout演算法描述:
兩個序列x,y;此問題具有最優子結構特性。
當xm=yn時,先求出xm-1和yn-1的最長公共子串行,並在尾部加上xm。
當xm!=yn時,必須求解xm-1和yn以及xm和yn-1的最長公共子串行。
c(i,j):儲存xi和yj的最長公共子串行的長度。
能得到以下遞推關係:
c(i,j)=0 i=0,j=0;
c(i,j)=c(i-1,j-1)+1 xi=yi
c(i,j)=max xi!=yi;
源程式:
#include #include using namespace std;
char x[100],y[100];//x,y字串
class lcs
//動態規劃求最長公共子串行
int lcslength()
else if(c[i-1][j]>=c[i][j-1])
else
}} return c[m][n];
}};int main()。
源程式:
#include using namespace std;
//比較兩者中的較大值
int max(int a,int b)3
int main()
} cout演算法描述:
用動態規劃自底向上的求解問題。這裡我用用另乙個陣列來儲存最終結果值。先初始化陣列。m(i,i)=0,m(i,i+1)=r(i,i+1)。我輸入的陣列下標是從1開始的。迴圈向上求解,類似最優二叉搜尋樹演算法。m(i,j)=min。根據狀態方程判斷是否滿足條件。
源程式:
#include using namespace std;
//查詢分開的節點
int find(int i,int j,int r[100][100],int m[100][100]) }
// 把r陣列存入m陣列
for(i=1;i<=n;i++)
int mm;
// 動態規劃求解最少費用
動態規劃例子
對於由從1到n 1 n 39 這n個連續的整數組成的集合來說,我們有時可以將集合分成兩個部分和相同的子集合。例如,n 3時,可以將集合 分為和。此時稱有一種方式 即與順序無關 n 7時,共有四種方式可以將集合 分為兩個部分和相同的子集合 和 和 和 和 輸入 程式從標準輸入讀入資料,只有一組測試用例...
動態規劃經典例子
金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行 今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n元。於是,他把每件物品規定了乙個重要度,分為5...
動態規劃經典例子
求第一層到最後一層的路徑,將該路徑上的所有數字相加後得到的和最大是多少。include using namespace std const int maxn 1000 int f maxn maxn dp maxn maxn int main for int i 1 i n i for int i ...