#学习记录#
#include <iostream>
#include <vector>
using namespace std;
// 矩阵连乘问题算法
void matrixChainMultip(const vector<int>& p) { //p为矩阵维度数组, n个数组有n+1个纬度值
int num = p.size() - 1; //第i个矩阵的维度为p[i-1]*p[i]
vector<vector<int>> m(num + 1, vector<int>(num + 1, 0)); //数组m记录最优值
for (int r = 2; r <= num; ++r) { //r表示问题规模
for (int i = 1; i <= num - r + 1; ++i) { //第二层循环,规模为r的子问题个数
int j = i + r - 1;
m[i][j] = m[i + 1][j] + p[i - 1] * p[i] * p[j]; //记录从i处断开的值
for (int k = i + 1; k < j; ++k) {
int q = m[i][k] + m[k + 1][j] + p[i - 1] * p[k] * p[j];
if (q < m[i][j]) {
m[i][j] = q; //如果从k处断开更优则更新m数组
}
}
}
}
cout << m[1][num] << endl;
}
int main() {
int num; //矩阵个数
while (cin >> num) { //可连续输入不同矩阵连乘问题, 输入Ctrl+Z结束
vector<int> p(num + 1);
for (int i = 0; i <= num; ++i) {
cin >> p[i];
}
matrixChainMultip(p);
}
return 0;
}
input:
两行输入
第一行输入矩阵个数n
第二行输入所有矩阵维度 n+1 个数