/**
* @file DPMatrixChain.cpp
* @brief a solution of MatrixChain with DP's way.
* @author/Univ taoxiaoxiao/Univ.
* @date 11-3-2013
* @version v1.0
*/
//实例:矩阵维数30X35 35X15 15X5 5X10 10X20 20X25
#include <iostream>
#include <vector>
using namespace std;
#define N 6
#define INF 0x3f3f3f3f
int m[N + 1][N + 1], s[N + 1][N + 1];
void DPMatrixChain(vector<int> p)
{
int n = p.size() - 1;
int i, j, c, k;
for (i = 1; i <= n; ++i)
m[i][i] = 0;
for (c = 2; c <= n; ++c)
{
for (i = 1; i <= n - c + 1; ++i)
{
j = i + c - 1;
m[i][j] = INF;
for (k = i; k <= j - 1; ++k)
{
int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
if (q < m[i][j])
{
m[i][j] = q;
s[i][j] = k;
}
}
}
}
}
void showpath(int i, int j)
{
if (i == j)
cout << "A" << i;
else
{
cout << "(";
showpath(i, s[i][j]);
showpath(s[i][j] + 1, j);
cout << ")";
}
}
int main()
{
vector<int> p{ 30, 35, 15, 5, 10, 20, 25 };
DPMatrixChain(p);
cout << "最优加括号方式为:";
showpath(1, 6);
cout << endl;
cout << "最小乘法次数:" << m[1][6] << endl;
return 0;
}
输出