https://www.luogu.org/problemnew/show/P1063
能量项链这一道题目中每个珠子都有两个值(头标,尾标),我们可以用head[i]表示第i个珠子的头标,tail[i]表示第i个珠子的尾标,则合并i和i+1的珠子所产生的能量总和就是E=head[i]乘tail[i]乘tail[i+1]。与合并石子类似,不一定按照顺序。设s[i][j]为第i合并到第j颗是可以产生的最大能量。
最后合并时的位置k和k+1,就可以列出转移方程。此时tail head处理在一起成为一个t数组。
s[j][i]=max(s[j][i],s[j][k]+s[k+1][i]+t[j]*t[k+1]*t[i+1]);
然后剩下的就是初始化和寻找答案了。
#include<iostream>
#include<cstdio>
using namespace std;
int n,t[300],s[300][300],maxn;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&t[i]);
t[i+n]=t[i];
}
for(int i=2;i<n*2;i++)
{
for(int j=i-1;i-j<n&&j>=1;j--)
{
for(int k=j;k<i;k++)
s[j][i]=max(s[j][i],s[j][k]+s[k+1][i]+t[j]*t[k+1]*t[i+1]);
if(s[j][i]>maxn)maxn=s[j][i];
}
}
printf("%d",maxn);
return 0;
}