能量项链
题解:
题意就不多赘述了。直接说怎么解法吧,这道题和之前的石子合并非常相似,都是环形的,那么我们解决环形的DP大部分是多给他加一圈然后解开,就变成了一个线性的DP 了。
还是按照DP步骤来吧。
1,集合:L,R区间合成的能量环所释放的答案的集合。
2,属性:最大值
3,状态:区间DP大部分状态就是L和R
4,last:和石子一样,我们每一个点都可能成为last点(因为last点的值不一样都可能造成我们释放能量不一样)
所以我们状态转移也就知道了:f[l][r]=f[l][k]+f[k][r]+w[l]*w[k]*w[r]
所以代码如下
#include<bits/stdc++.h>
using namespace std;
const int N=6e2+5;
int f[N][N],a[N];
int main()
{
int n; cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
a[i+n]=a[i];
}
for(int len=3;len<=n+1;len++){
for(int l=1;len+l-1<=2*n;l++){
int r=l+len-1;
for(int k=l+1;k<r;k++){
f[l][r]=max(f[l][r],f[l][k]+f[k][r]+a[l]*a[k]*a[r]);
}
}
}
int res=0;
for(int i=1;i<=n;i++){
res=max(f[i][i+n],res);
}
cout<<res<<endl;
}