【正经题解】能量项链
2024-02-21 11:30:42
发布于:美国
30阅读
0回复
0点赞
区间动规
重点就是将整体划分为区间,小区间之间合并获得大区间
状态转移方程的推导如下
一、将珠子划分为两个珠子一个区间时,这个区间的能量 左边珠子右边珠子右边珠子的下一个珠子
二、区间包含 个珠子,可以是左边单个珠子的区间 右边两珠子的区间,或者左边两珠子的区间右边 单个珠子的区间
即,先合并两个珠子的区间,释放能量,加上单个珠子区间的能量(单个珠子没有能量。。)
(两个珠子的区间的能量 单个珠子区间的能量,单个珠子的区间的能量 两个珠子的区间的能量 )
三、继续推 个珠子的区间, 个珠子的区间。
于是可以得到方程: (不操作的能量,左区间合并后的能量 右区间合并后的能量 两区间合并产生能量)
两区间合并后产生的能量 左区间第一个珠子右区间第一个珠子总区间后面的一个珠子
#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;
}
这里空空如也
有帮助,赞一个