区间DP-能量项链

能量项链

题解:

题意就不多赘述了。直接说怎么解法吧,这道题和之前的石子合并非常相似,都是环形的,那么我们解决环形的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;
}

发布了92 篇原创文章 · 获赞 6 · 访问量 1186

猜你喜欢

转载自blog.csdn.net/weixin_42979819/article/details/103891130