一、實驗目的:
1.通過動態規劃演算法的示例程式理解動態規劃演算法的基本思想;
2.運用動態規劃演算法解決實際問題加深對動態規劃演算法的理解和運用;
二、實驗環境:
visual c++ 實驗環境
三、實驗內容:
(寫出主要的內容)
分析並掌握「最長公共子串行」 問題的動態規劃演算法求解方法;
最長公共子串行問題:若給定序列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的最長公共子串行。
在參考程式的基礎上,編寫主函式,實現最長公共子串行的動態規劃求解。測試資料報括教材155頁演算法設計題中給出的資料,另外再自己設計兩組測試資料。
**:
#include
>
using namespace std;
int b[100][100];
int c[100][100];
int m,n;
void lcslength(char *x ,char *y,int m,int n, int c[100][100], int b[100][100])
else if(c[i-1][j]>=c[i][j-1])else
}}void lcs(int i ,int j, char *x ,int b[100][100])
。其中ai與ai+1是可乘的,i=1,2,…,n-1。要求計算出這n個矩陣的連乘積a1a2…an,最少的乘法次數。
遞迴公式:
請編寫程式實現矩陣連乘問題的動態規劃演算法,自己設計不少於3組的測試資料,要求顯示出最少的乘法次數,以及最優計算次序。
**:
#include
>
using namespace std;
int m[100][100],s[100][100];
int sum;
void matrixchain(int *p,int n,int m[100][100],int s[100][100])}}
}void traceback(int i,int j,int s[100])
else
}int
main()
else
int s2 = 0;
int rights = 0;
for( i = mid + 1; i < right; i++)
sum = s1 + s2;
if(sum < leftsum)
sum = leftsum;
if(sum < rightsum)
sum = rightsum;
} return sum;
}int maxsum(int a, int n)
int main()
else
if (b > sum)
} return sum;
}int main()
return sum;
}
int main()
else
m[i][j]=max;
} }
} cout執行結果:
實驗5 動態規劃實驗一
oj練習 1.multiplication puzzle 2.該題可以轉化為矩陣連乘問題 3.common subsequence 4.該題只需要輸出最長公共子串行的長度 3 human gene functions human gene functions 變形 4 compromise 問題 5...
演算法實驗之動態規劃
設有n種不同面值的硬幣,各硬幣的面值存於陣列t 1 n 中。現要用這些面值的硬幣來找錢,可以實用的各種面值的硬幣個數不限。當只用硬幣面值t 1 t 2 t i 時,可找出錢數j的最少硬幣個數記為c i,j 若只用這些硬幣面值,找不出錢數j時,記c i,j 輸入結果儲存在1.txt中,輸出結果儲存在2...
演算法實驗六 動態規劃
一 實驗目的 通過動態規劃演算法的示例程式理解動態規劃演算法的基本思想 運用動態規劃演算法解決實際問題加深對動態規劃演算法的理解和運用 二 實驗環境 dev c eclipse ide 三 實驗內容 1.分析並掌握 最長公共子串行 問題的動態規劃演算法求解方法 最長公共子串行問題 若給定序列x 則另...