题面
思路
这是一道区间dp的模板题。
设 f i , j f_{i,j} fi,j表示 [ i , j ] [i,j] [i,j]区间合并珠子后最大能量。
我们可以考虑把环拆成一条链即 [ 1 , 2 × n − 1 ] [1,2\times n-1] [1,2×n−1]来考虑。
那么 f i , j = f i , k + f k + 1 , j + a i × a k + 1 × a j + 1 f_{i,j}=f_{i,k}+f_{k+1,j}+a_i\times a_{k+1}\times a_{j+1} fi,j=fi,k+fk+1,j+ai×ak+1×aj+1
Code
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
#define clear(x) memset(x,0,sizeof(x))
#define ll long long
using namespace std;
int n,a[1005];
ll f[1005][1005];
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]),a[i+n]=a[i];
for(int len=2;len<=n;len++)
for(int l=1;l+len-1<2*n;l++)
{
int r=l+len-1;
for(int k=l;k<r;k++)
f[l][r]=max(f[l][r],f[l][k]+f[k+1][r]+a[l]*a[k+1]*a[r+1]);
}
ll maxn=0;
for(int i=1;i<=n;i++)
maxn=max(maxn,f[i][i+n-1]);
printf("%lld",maxn);
}