问题描述
有 n 个矩阵,大小分别为 a0 * a1, a1 * a2, a2 * a3, …, an-1 * an,现要将它们依次相乘,只能使用结合率,求最少需要多少次运算。
两个大小分别为 p * q 和 q * r 的矩阵相乘时的运算次数计为 p * q * r。
输入格式
输入的第一行包含一个整数 n,表示矩阵的个数。
第二行包含 n+1 个数,表示给定的矩阵。
输出格式
输出一个整数,表示最少的运算次数。
样例输入
3
1 10 5 20
样例输出
150
数据范围
1 ≤ n ≤ 1000,
1 ≤ ai ≤ 10000
题解
动态规划:
【能量项链】的简化版,而这题的数据范围是1000, 却依然能过,说明官网的测试数据是相当水了🤣
#include <iostream>
#include <cstring>
using namespace std;
const int N = 1010;
int e[N], f[N][N];
int main()
{
int n;
cin >> n;
for (int i = 1; i <= n + 1; i ++) cin >> e[i];
memset(f, 0x3f, sizeof f);
for (int len = 1; len <= n; len ++)
for (int l = 1; l + len - 1 <= n; l ++)
{
int r = l + len - 1;
if(len == 1) f[l][r] = 0;
else
{
for (int k = l; k < r; k ++)
f[l][r] = min(f[l][r], f[l][k] + f[k + 1][r] + e[l] * e[k + 1] * e[r + 1]);
}
}
cout << f[1][n] << endl;
return 0;
}