1 条题解

  • 0
    @ 2025-8-24 21:20:31

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar voilin
    **

    搬运于2025-08-24 21:20:30,当前版本为作者最后更新于2017-09-15 19:50:18,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    //区间动规 
    //重点就是将整体划分为区间,小区间之间合并获得大区间
    //状态转移方程的推导如下
    //一、将珠子划分为两个珠子一个区间时,这个区间的能量=左边珠子*右边珠子*右边珠子的下一个珠子
    //二、区间包含3个珠子,可以是左边单个珠子的区间+右边两珠子的区间,或者左边两珠子的区间右边+单个珠子的区间 
    //即,先合并两个珠子的区间,释放能量,加上单个珠子区间的能量(单个珠子没有能量。。)
    //Energy=max(两个珠子的区间的能量+单个珠子区间的能量,单个珠子的区间的能量+两个珠子的区间的能量 ) 
    //三、继续推4个珠子的区间,5个珠子的区间。
    //于是可以得到方程:Energy=max(不操作的能量,左区间合并后的能量+右区间合并后的能量+两区间合并产生能量)
    //两区间合并后产生的能量=左区间第一个珠子*右区间第一个珠子*总区间后面的一个珠子 
    #include<bits/stdc++.h>
    using namespace std;
    int n,e[300],s[300][300],maxn=-1;
    int main(){
        cin>>n;
        for(int i=1;i<=n;i++){cin>>e[i];e[i+n]=e[i];}
        //珠子由环拆分为链,重复存储一遍
        for(int i=2;i<2*n;i++){
            for(int j=i-1;i-j<n&&j>=1;j--){//从i开始向前推
                for(int k=j;k<i;k++)//k是项链的左右区间的划分点 
                s[j][i]=max(s[j][i],s[j][k]+s[k+1][i]+e[j]*e[k+1]*e[i+1]);
                //状态转移方程:max(原来能量,左区间能量+右区间能量+合并后生成能量)  
                if(s[j][i]>maxn)maxn=s[j][i];//求最大值 
            }
        } 
        cout<<maxn;
        return 0;
    }
    
    • 1

    信息

    ID
    65
    时间
    1000ms
    内存
    128MiB
    难度
    4
    标签
    递交数
    1
    已通过
    1
    上传者