二刷提高课,题解目录在这里— 提高课的题解目录
此题和上一题大同小异,就是在链式条件枚举如何选取使得最后结果最大
我们依然将n扩大两倍来进行优化(解决一般链式问题的核心)
#include<iostream>
using namespace std;
const int N=210;
int f[N][N];
int w[N];
int n;
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>w[i];
w[i+n]+=w[i];
}
for(int len=3;len<=n+1;len++)
{
for(int l=1;l+len-1<=2*n;l++)
{
int r=l+len-1;
for(int k=l+1;k<r;k++)//注意这里是l+1
f[l][r]=max(f[l][r],f[l][k]+f[k][r]+w[l]*w[k]*w[r]);
}
}
int res=0;
for(int i=1;i<=n;i++)
{
res=max(res,f[i][i+n]);
}
cout<<res;
return 0;
}