和环形合并石子很像,没做过合并石子的推荐先去做它。
这是石子合并的题解,这里就不多啰嗦了。
#include<iostream>
#include<cstdio>
#include<iomanip>
#include<cstring>
#include<algorithm>
using namespace std;
int n,a[101],f[201][201],ans=0;
int main()
{
cin>>n;
for(int i=1;i<=n;++i)
cin>>a[i];
for(int i=n+1;i<=n*2;++i)
a[i]=a[i-n];
for(int i=1;i<=2*n;++i)
{
for(int j=1;j<=n*2;++j)
f[i][j]=-1;
f[i][i]=0;
}
for(int i=2*n;i>=1;--i)
for(int j=i+1;j<=n*2;++j)
for(int k=i;k<j;++k)
f[i][j]=max(f[i][j],f[i][k]+f[k+1][j]+a[i]*a[k+1]*a[j+1]);
for(int i=1;i<=n;++i)
{
if(f[i][i+n-1]>ans)
ans=f[i][i+n-1];
}
cout<<ans;
return 0;
}