动态规划:
m[i][j]表示矩阵i到矩阵j相乘所需要的最小步骤
m[i][j]可以分割为m[i][k]和m[k+1][j]
即状态转移方程为:
m[i][j]=max(m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j]),i<= k < j
#include <iostream>
#include <cstdio>
using namespace std;
int n;
int p[20]; //矩阵的维数
int m[20][20]; //m[i][j]表示矩阵i到矩阵j相乘所需要的最小步骤
int s[20][20];
void TraceBack(int i, int j)
{
if(i == j)
return;
TraceBack(i, s[i][j]);
TraceBack(s[i][j]+1, j);
printf("Multiply A%d,%d and A%d,%d",i, s[i][j], s[i][j]+1, j);
}
void matrixChain()
{
for(int i = 1; i <= n; i ++)
m[i][i] = 0; //单个矩阵运算次数为0
for(int r = 2; r <= n; r ++) //矩阵间隔
{
for(int i = 1; i <= n-r+1; i++) //矩阵开始位置
{
int j = i+r-1; //矩阵结束位置
s[i][j] = i; //截断位置为i
m[i][j] = m[i][i+0]+m[i+1][j]+p[i-1]*p[i]*p[j];
for(int k = i+1; k < j; k++) //截断位置i+1, i+2...
{
int t = m[i][k]+m[k+1][j]+p[i-1]*p[k]*p[j];
if(t < m[i][j])
{
s[i][j] = k;
m[i][j] = t;
}
}
}
}
printf("%d\n", m[1][n]);
}
int main()
{
int row, col;
scanf("%d", &n);
for(int i = 0; i < n; i ++)
{
scanf("%d%d", &row, &col);
p[i] = row;
}
p[n] = col;
matrixChain();
}