關於動態規劃演算法,首先是:
什麼樣子的問題適合用動態規劃演算法來解呢?
適合用動態規劃演算法解的問題應具有兩個性質:最優子結構性質和具有重複子問題
最優子結構性質是指:若乙個問題的最優解包含其子問題的最優解,則此問題具有最優子結構性質。
具有重複子問題性質是指:問題的遞迴演算法會反覆求解相同的子問題。
然後是:
動態規劃演算法的設計有四個步驟:
1.刻畫乙個最優解的結構特徵-尋找最優子結構;
2.遞迴地定義最優解的值;
3.計算最優解的值,通常採用自底向上的方法;
4.利用計算出的資訊構造乙個最優解。
動態規劃演算法有4個經典問題:鋼條切割、矩陣鏈乘法、最長公共子串行、最優二叉搜尋樹。
鋼條切割
給定一段長度為n英吋的鋼條和乙個**表,求切割鋼條的方案,使受益最大。
求解方法:將鋼條從左邊切下長度為i的一段,只對右邊剩下的長度為n-i的一段繼續切。
**表如下:
長度i123
4567
8910**p[i]15
891017
1720
2430
動態規劃求解有兩種方法:帶備忘的自頂向下法和自底向上法,期望執行時間都為:θ(n²)。
(1)帶備忘的自頂向下法:按照遞迴形式編寫過程,但過程中會儲存每乙個子問題的解。當需要乙個子問題的解時,過程首先檢查是否已經儲存過此解,若是則返回儲存的值。
(2)自底向上法:當求解其子問題時,它所依賴的那些更小的子問題都已經求解完畢並且結果已經儲存。
下面就貼程式原始碼了:
rodcutting.h:
#include#include#includeint memoizedcutrod(int *p,int n,int *r);//帶備忘的自頂向下法
int extendedbottomupcutrod(int *p,int n,int *r,int *s);//擴充套件的自底向上法
void printcutrodsolution(int *p,int n);//列印結果
rodcutting.cpp
#include"rodcutting.h"
int memoizedcutrodaux(int *p,int n,int *r);
int memoizedcutrod(int *p,int n,int *r)
}
main.cpp:
#include"rodcutting.h"
int main();
int n,i;
printf("please input the length of the rod:\n");
scanf("%d",&n);
int *r;
r=(int *)malloc(sizeof(int)*(n+1));
int q;
q=memoizedcutrod(p,n,r);
printf("the maximum income is:%d\n",q);
printf("every little income is:\n");
for(i=0;iprintf("\n");
printcutrodsolution(p,n);
system("pause");
return 0;
}
動態規劃之鋼條切割
最近學習動態規劃,做個匯報吧!不同長度的鋼條,賣出時收益不同 1,1 2,5 3,8 4,9 5,10 6,17 7,17 8,20 9,24 10,30 問題就是我有一根鋼條,怎樣可以收益最大?這裡只寫思想,不寫過程,專注於演算法 一根鋼條,假如10公尺,我可以整體去賣,也可以切斷幾段去賣,那就用...
動態規劃之鋼條切割
假定某公司購買長鋼條,將其切割為短鋼條進行 切割工序本身沒有成本支出 考慮求出最佳的切割方案。一段長度為i的鋼條 如下表 長度i p11 2538 49510 617717 820924 1030 長度為n的鋼條共有2的n 1次方種不同的切割方案,因為在距離鋼條左端i處,總是可以選擇切割或不切割。所...
動態規劃 鋼條切割
一家公司購買長鋼條,將其切割成短鋼條 切割本身沒有成本,長度為i的短鋼條的 為pi。那給定一段長度為n的鋼條和乙個 表pi,求鋼條的切割方案使得收益rn最大。如乙個pi如下 長度i12 3456 78910 pi15 891017 1720 2430 在距離鋼條左端i長度處,我們總是可以選擇切割或者...