1 条题解
-
0
自动搬运
来自洛谷,原作者为

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
- 上传者