代码:
方法一——没用记忆搜索:
int helper(vector<int>& matrices, vector<vector<int>>& opt, int i, int j) {
if (i == j)return 0;
for (int k = i; k < j; k++) {
int q = helper(matrices, opt, i, k) + helper(matrices, opt, k + 1, j) + matrices[i] * matrices[k + 1] * matrices[j+1];
if (q < opt[i][j]) {
opt[i][j] = q;
}
}
return opt[i][j];
}
int min(vector<int>& matrices) {
int size = matrices.size() - 1;
vector<vector<int>> opt (size, vector<int>(size, INT_MAX));
int res = helper(matrices, opt,0, size-1);
return res;
}
int main() {
vector<int> v = {5,4,2,6,7};
int res = min(v);
int c;
cin >> c;
return 0;
}
方法二——采用记忆搜索:
#include<iostream>
#include<algorithm>
#include<sstream>
#include<string>
#include<vector>
using namespace std;
#define INT_MAX 0x7ffffff
int findmin(vector<int>& matrix, vector<vector<int>>& s) {
int size = matrix.size();
if (size <= 1)return 0;
vector<vector<int>> opt(size - 1, vector<int>(size - 1, 0));
for (int l = 2; l < size; l++) {
for (int i = 0; i < size - l; i++) {
int j = i + l - 1;
opt[i][j] = INT_MAX;
for (int k = i; k < j; k++) {
int temp = opt[i][k] + opt[k + 1][j] + matrix[i] * matrix[k + 1] * matrix[j + 1];
if (temp < opt[i][j]) {
opt[i][j] = temp;
s[i][j] = k;
}
//opt[i][j] = min(opt[i][j], opt[i][k] + opt[k + 1][j] + matrix[i] * matrix[k + 1] * matrix[j + 1]);
//s[i][j] = k;
}
}
}
return opt[0][size - 2];
}