一、實驗目的:
1.通過動態規劃演算法的示例程式理解動態規劃演算法的基本思想;
2.運用動態規劃演算法解決實際問題加深對動態規劃演算法的理解和運用;
二、實驗環境:
dev-c++,eclipse ide
三、實驗內容:
1. 分析並掌握「最長公共子串行」 問題的動態規劃演算法求解方法;
最長公共子串行問題:若給定序列x=,則另一串行z=,是x的子串行是指存在乙個嚴格遞增下標序列使得對於所有j=1,2,…,k有:zj=xij。例如,序列z=是序列x=的子串行,相應的遞增下標序列為。
給定2個序列x和y,當另一串行z既是x的子串行又是y的子串行時,稱z是序列x和y的公共子串行。
給定2個序列x=和y=,找出x和y的最長公共子串行。
2. 計算矩陣連乘積
在科學計算中經常要計算矩陣的乘積。矩陣a和b可乘的條件是矩陣a的列數等於矩陣b的行數。若a是乙個p×q的矩陣,b是乙個q×r的矩陣,則其乘積c=ab是乙個p×r的矩陣。由該公式知計算c=ab總共需要pqr次的數乘。其標準計算公式為:
現在的問題是,給定n個矩陣。其中ai與ai+1是可乘的,i=1,2,…,n-1。要求計算出這n個矩陣的連乘積a1a2…an,最少的乘法次數。
遞迴公式:
請編寫程式實現矩陣連乘問題的動態規劃演算法,要求顯示出最少的乘法次數,以及最優計算次序。
void matrixchain(int *p,int n,int **m,int **s)
} } }
void traceback(int i,int j,int **s)
}
#include using namespace std;
int matrixchain_getoptimalvalue(const int *p, int n, int *s)
// p: (in) 矩陣的行數和列數
// n: (in) 矩陣數量
// s: (out) 子鏈最優斷開位置
// 返回值:最優鏈的計算量
return sum;
}int main()
; printf("序列:");
for(int i=0;i<7;i++)
printf("%d ",a[i]);
printf("\n");
printf("最大子段和為:%d",maxsum(n,a));
return 0;
}
4.最大k乘積問題。
問題描述:設x是乙個n位十進位制整數,如果將x劃分為k段,則可得到k個整數,這k個整數的乘積稱為x的乙個k乘積。請設計演算法並程式設計實現,對於給定的x 和k,求出x的最大k乘積。
輸入:x,k,n
輸出:x的最大k乘積。
#include#include#include#includeusing namespace std;
int ans[1000][1000];
void getans(int n,int k,int num)
ans[i][j]=m;}}
}int main(){
int n,k,x;
printf("請輸入數字、段數、數字位數:\n");
實驗六( 動態規劃演算法)
通過動態規劃演算法的示例程式理解動態規劃演算法的基本思想 運用動態規劃演算法解決實際問題加深對動態規劃演算法的理解和運用 visual studio 2013 寫出主要的內容 最長公共子串行問題 若給定序列x 則另一串行z 是x的子串行是指存在乙個嚴格遞增下標序列使得對於所有j 1,2,k有 zj ...
演算法實驗之動態規劃
設有n種不同面值的硬幣,各硬幣的面值存於陣列t 1 n 中。現要用這些面值的硬幣來找錢,可以實用的各種面值的硬幣個數不限。當只用硬幣面值t 1 t 2 t i 時,可找出錢數j的最少硬幣個數記為c i,j 若只用這些硬幣面值,找不出錢數j時,記c i,j 輸入結果儲存在1.txt中,輸出結果儲存在2...
演算法實驗3《動態規劃演算法實驗》
1.編寫乙個簡單的程式,解決0 1揹包問題。設n 5,c 10,w v include using namespace std void knapsack int v,int w,int c,int n,int m m 1 c m 2 c if c w 1 m 1 c m 1 c m 2 c w 1...