算法设计与分析课程实验报告
实验名称: 班级:: 学号: 姓名: 指导老师:
- 实验目的
1.理解动态规划算法概念。
2.掌握动态规划算法的基本要素:
(1)最优子结构性质
(2)重叠子问题性质
- 实验关键信息记录
#include <iostream>
#include <cstdlib>
using namespace std;
int m[100][100];
int s[100][100];
int p[8] = { 30,35,15,5,10,20,25,34 };
int LookupChain(int i, int j)
{
if (m[i][j] > 0) //表示相应的子问题已经被计算过了,直接返回结果即可
return m[i][j];
if (i == j)
return 0;
int u = LookupChain(i, i) + LookupChain(i + 1, j) + p[i - 1] * p[i] * p[j];
s[i][j] = i;
for (int k = i + 1; k < j; k++)
{
int t = LookupChain(i, k) + LookupChain(k + 1, j) + p[i - 1] * p[k] * p[j];
if (t < u)
{
u = t;
s[i][j] = k;
}
}
m[i][j] = u;
return u;
}
int Zuiyouzhi(int n)//求最优值
{
for (int i = 1; i <= n; i++)
for (int j = i; j <= n; j++)
m[i][j] = 0;
return LookupChain(1, n);
}
void Zuiyoujie(int i, int j)//求最优解
{
if (i == j)
return;
Zuiyoujie(i, s[i][j]);
Zuiyoujie(s[i][j] + 1, j);
cout << "矩阵 A" << i << "," << s[i][j];
cout << " and A" << (s[i][j] + 1) << "," << j << endl;
}
int main()
{
int Zuiyouzhi(7);
cout << m[1][7] << endl;;
Zuiyoujie(1, 7);
return 0;
}
结果:
- 实验总结