矩阵链相乘问题(基于动态规划的迭代法求解)

题目描述

有若干个矩阵{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。 
输出 
一个整数,表示最少所需的乘法次数 
样例输入 

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;



}

猜你喜欢

转载自blog.csdn.net/zxyhfdl/article/details/80353165