1.自底向上法
#include <iostream>
#define N 100
#define MAXVALUE 1000000000
using namespace std;
int m[N][N], s[N][N];
void matrixChainOrder(int *p, int n) {
int i, j, l, k, temp;
for(i = 1; i < n; i++)
m[i][i] = 0;
for(l = 2; l < n; l++) {
for(i = 1; i < n - l + 1; i++) {
j = i + l - 1;
m[i][j] = MAXVALUE;
for(k = i; k < j; k++) {
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;
}
}
}
}
}
void printOptimalParens(int s[N][N], int i, int j) {
if(i == j)
cout<<"A"<<i;
else {
cout<<"(";
printOptimalParens(s, i, s[i][j]);
printOptimalParens(s, s[i][j] + 1, j);
cout<<")";
}
}
int main() {
int i, n, p[N];
cin>>n;
for(i = 0; i < n; i++)
cin>>p[i];
matrixChainOrder(p, n);
printOptimalParens(s, 1, n - 1);
return 0;
}
测试数据