http://lx.lanqiao.cn/problem.page?gpid=T417
#include <iostream>
#include <algorithm>
#include <map>
#include <cmath>
#include <queue>
#include <cstring>
using namespace std;
const int maxn=1010;
const long long INF=1e18;
int n;
long long a[maxn];
long long dp[maxn][maxn];
// dp[i][j]第i个矩阵到第j个矩阵所需要的最小运算数
int main(){
scanf("%d",&n);
for (int i=0;i<=n;i++){
scanf("%lld",&a[i]);
}
memset(dp,0,sizeof(0));
for (int len=2;len<=n;len++){ //枚举长度
for (int l=1,r=len;r<=n;l++,r++){ //枚举左端点和右端点
dp[l][r]=INF;
for (int k=l;k<r;k++){ //枚举中点
dp[l][r]=min(dp[l][r],dp[l][k]+dp[k+1][r]+a[l-1]*a[k]*a[r]);
}
}
}
printf("%lld",dp[1][n]);
}