区间DP3:320
作者:
总打瞌睡的天天啊
,
2024-10-17 15:56:57
,
所有人可见
,
阅读 2
//状态表示:f[i][j],从第i到第j个珠子完全合并获得的能量的最大值
//状态转移:f[i][j]=f[i][k]+f[k+1][j]+h[i]*h[k+1]*h[j+1]
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=410;
int f[N][N];
int h[N*2];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)cin>>h[i],h[i+n]=h[i];
for(int len=1;len<=n;len++)
for(int l=1,r;r=l+len-1,r<=n*2;l++)
for(int k=l;k<r;k++)
f[l][r]=max(f[l][k]+f[k+1][r]+h[l]*h[k+1]*h[r+1],f[l][r]);
int maxx=0;
for(int i=1;i+n-1<2*n;i++)
maxx=max(f[i][i+n-1],maxx);
cout<<maxx;
return 0;
}