思路
非常经典的一道题,是紫书上的题目,动态规划,f[i][j]表示起点为i,终点为j的区间合并的最小值,我们枚举一下区间长度,因为大的区间的值是由小的区间来递推出来的,所以区间长度从小到大枚举,然后枚举一下起点,在枚举一下形成[i,j]的区间的最后一次矩阵合并时那两个区间的矩阵即可,这里可能爆int,所以用long long;
代码
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
const int N=1010;
ll f[N][N];
ll a[N];
int n;
int main(){
cin >> n;
n++;
ll INF=0x3f3f3f3f3f3f3f3f3f;
for(int i=0;i<n;i++){
cin >> a[i];
}
for(int len=3;len<=n;len++){
for(int i=0;i+len<=n;i++){
int l=i;
int r=i+len-1;
f[l][r]=INF;
for(int k=l+1;k<r;k++){
f[l][r]=min(f[l][r],f[l][k]+f[k][r]+(a[l]*a[k]*a[r]));
}
}
}
cout << f[0][n-1];
}