实例1 矩阵连乘问题
问题描述:给定n个矩阵{A1,A2,…,An},其中Ai与Ai+1是可乘的,i=1,2 ,…,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。例如:
A1={30x35} ;A2={35x15} ;A3={15x5} ;A4={5x10} ;A5={10x20} ;A6={20x25} ;
最后的结果为:((A1(A2A3))((A4A5)A6)) 最小的乘次为15125。
#include<iostream>
using namespace std;
#define INF 1000000;
int main()
{
int n, m[100][100], p[100] = { 0 };
cin >> n;
int i, j, r, k;
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
{
if (i == j) m[i][j] = 0;
else m[i][j] = INF;
}
for (i =1; i <= n+1; i++)
cin >> p[i-1];//输入每个矩阵的行数和最后一个矩阵的列数
for(r=2;r<=n;r++)//r为连乘矩阵的个数
for (i = 0; i <= n - r; i++)//i是连乘矩阵中的第一个
{
j = i + r - 1;//j是连乘矩阵中的最后一个
for (k = i; k <= j - 1; k++)//寻找i,j之间最合适的断开点,先计算两个单独矩阵相乘
{
int temp = m[i][k] + m[k + 1][j] + p[i] * p[k + 1] * p[j + 1];//p[i-1]表示的是第i个矩阵的行数,p[k]表示i:k矩阵合起来后最后得到的列数,p[j]是k+1:j合起来后得到的列数
if (temp < m[i][j])
{
m[i][j] = temp;
}
}
}
cout << m[1][n] << endl;
return 0;
}