作者:
Liyb
,
2022-08-04 08:15:32
,
所有人可见
,
阅读 4
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
const int N = 210;
int w[N];
int f[N][N];
int n;
int main()
{
cin >> n;
for(int i = 1; i <= n; i ++)
{
cin >> w[i];
w[i + n] = w[i];
}
memset(f,-0x3f,sizeof f);
//长度为3的时候才用进行合并
for(int len = 2; len <= n + 1; len ++)//从1到1,上一题是从1到n
for(int l = 1; l + len - 1 <= 2 * n; l ++)
{
int r = l + len - 1;
if(len == 2)f[l][r] = 0;//一个珠子的情况
else
for(int k = l + 1; k < r; k ++)//三个数中间的那个才能作为分界点
f[l][r] = max(f[l][r], f[l][k] + f[k][r] + w[l] * w[r] * w[k]);
}
int res = 0;
for(int i = 1; i <= n; i ++)res = max(res, f[i][i + n]);
cout << res << endl;
return 0;
}