【NOIP2006 提高组】 能量项链

能量项链

题面

在这里插入图片描述

思路

这是一道区间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×n1]来考虑。
那么 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);
}

猜你喜欢

转载自blog.csdn.net/weixin_46830417/article/details/113070709