P1063能量项链

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;
}

猜你喜欢

转载自www.cnblogs.com/LSWorld/p/partdp1.html