题目描述
有若干个矩阵{Ai},元素都为整数且已知矩阵大小。
如果要计算所有矩阵的乘积A1 * A2 * A3 .. Am,最少要多少次整数乘法?
输入
第一行一个整数n(n <= 100),表示一共有n-1个矩阵。
第二行n个整数B1, B2, B3… Bn(Bi <= 100),第i个数Bi表示第i个矩阵的行数和第i-1个矩阵的列数。
等价地,可以认为第j个矩阵Aj(1 <= j <= n - 1)的行数为Bj,列数为Bj+1。
输出
一个整数,表示最少所需的乘法次数
样例输入
6
10 1 50 50 20 5
样例输出
3650
解题思路
法一:暴力搜索(范围太大时会超时)
法二:用递归思想(但每个子问题会出现多次计算,效率不高)
法三:用迭代方法(采用标记法,解决递归的重复计算问题)
代码如下
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
using namespace std;
int n;
int a[102];
//用于记录
long long int m[102][102];
long long int q;
//解的追踪:(用于输出最优解的路径,本题用不到)
int s[102][102];
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
//共有n-1个矩阵,长度为1的矩阵标记
for(int i=1;i<=n-1;i++)
{
m[i][i]=0;
}
//循环长度
for(int r=2;r<=(n-1);r++)
{
//循环起点
for(int i=1;i<=(n-1)-r+1;i++)
{
int j=i+r-1;
m[i][j]=100000000;
for(int k=i;k<(i+r);k++)
{
q=m[i][k]+m[k+1][j]+a[i]*a[k+1]*a[j+1];
if(q<=m[i][j])
{
m[i][j]=q;
//记录最优信息
s[i][j]=k;
}
}
}
}
/*
//输出断点
//如果输出的断点为1旳话,且有5个矩阵,代表(A1)(A2,A3,A4,A5)这样一个划分方法
int L=n-1;
while(1)
{
L=s[1][L];
if(L==1)
{
cout<<L<<endl;
break;
}
cout<<L<<" ";
} */
//输出最少乘法次数
cout<<m[1][n-1]<<endl;
}