和環形合併石子很像,沒做過合併石子的推薦先去做它。
這是石子合併的題解,這裏就不多囉嗦了。
#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;
}