代码:
#include "stdafx.h"
#include <iostream>
using namespace std;
int b[1000], m[1000][1000], t[1000][1000]; //数组b存储n个矩阵的阶数下标
void MatrixChain(int n)
{
for (int i = 1; i <= n; i++) m[i][i] = 0; //初始化
for (int r = 2; r <= n; r++)
{
for (int i = 1; i <= n - r + 1; i++)
{
int j = i + r - 1;
m[i][j] = m[i + 1][j] + b[i - 1] * b[i] * b[j];
t[i][j] = i;
for (int k = i + 1; k < j; k++)
{
int l = m[i][k] + m[k + 1][j] + b[i - 1] * b[k] * b[j];
if (l < m[i][j])
{
m[i][j] = l; //l:最小乘法次数
t[i][j] = k; //k:断开位置
}
}
}
}
}
void print(int i, int j)
{
if (i == j)
{
cout << "A" << i;
}
else if (i == j - 1)
{
cout << "(A" << i << "A" << j << ")";
}
else
{
cout << "(";
print(i, t[i][j]);
print(t[i][j] + 1, j);
cout << ")";
}
}
int main()
{
int n;
cin >> n;
for (int i = 0; i <= n; i++)
{
cin >> b[i];
}
MatrixChain(n);
print(1,n);
cout << endl;
return 0;
}
测试结果:
小结:
(1)动态规划的基本思想:它是一个自底向上的过长,求得的是整体最优解。
(2)矩阵连乘问题的原理与目的:
原理: 矩阵乘法的基本性质之一——结合律,例:(AB)C=A(BC)
就会出现这样的一种可能:某种情况下的结合,使得计算过程中乘法次数最少。
目的:找出乘法次数最少的情况,并以加最优括号的形式显示。