#include <iostream>
int m[1003][1003]; //m[i][j]记录从第i个矩阵到第j个矩阵最少乘法执行次数
int s[1003][1003]; //s[i][j]记录从第i个矩阵到第j个矩阵最优质m[i][j]的分割点k
int p[1003]; //第i个矩阵的行列分别是p[i-1]和p[i],1<=i<=n
using namespace std;
void print_optimal_parens(int i, int j) {
if (i == j) {
cout << "A" << i;
} else {
cout << "(";
print_optimal_parens( i, s[i][j]);
print_optimal_parens( s[i][j] + 1, j);
cout << ")";
}
}
int main()
{
int n;//n个矩阵
while(cin >> n){
p[0] = 10;
p[1] = 100;
p[2] = 5;
p[3] = 50;
for(int i = 0;i <= n;i++)
m[i][i] = 0; //i==j时表示一个矩阵,不需要乘法
for(int l = 2;l <= n;l++)//矩阵链的长度,也就是有多少矩阵相乘
for(int i = 1;i <= n - l + 1;i++){//循环第一个参数
int j = i + l - 1;//i开始的第l个矩阵j
m[i][j] = m[i][i] + m[i+1][j] + p[i-1] * p[i] * p[j];//初始化将第i个矩阵单独拿出作为一个划分,划分点为i
s[i][j] = i;
int temp;
for(int k = i + 1;k < j;k++){//遍历k找到长度为l时从第i个矩阵到第j个矩阵最少的一次划分
temp = m[i][k] + m[k + 1][j] + p[i-1] * p[k] * p[j];
if(temp < m[i][j]){
m[i][j] = temp;
s[i][j] = k;
}
}
}
print_optimal_parens(1, 3);
}
}
DP—矩阵链乘法(代码)
最新推荐文章于 2022-10-26 18:58:46 发布