能量项链

#include <bits/stdc++.h>
using namespace std;
//算法提高,能量项链,就是可以转圈的矩阵连乘问题
//把1->n扩展为1->n->n+1->2*n,然后对其进行dp,这样就循环起来了
int dp[2000][2000],n,a[1000],ans=0;//用i表示左维度,i+1表示右维度
int main() {
    cin>>n;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    a[n+1]=a[1];
    memset(dp,0, sizeof(dp));
    //[,]
    //注意以l开始循环,如果以i的话,会导致直接算1->n,就错了
    for(int l=1;l<=n;l++){
        for(int i=1;i<=2*n-l+1;i++){
            int j=l+i-1;
            for(int k=i;k<j;k++){
                dp[i][j]=max(dp[i][j],dp[i][k]+dp[k+1][j]+a[i>n?i-n:i]*a[j+1>n?j+1-n:j+1]*a[k+1>n?k+1-n:k+1]);
            }
            ans=max(ans,dp[i][j]);
        }
    }
    cout<<ans<<endl;
    return 0;
}

 

posted @ 2020-06-06 20:42  西伯利亚挖土豆  阅读(219)  评论(0编辑  收藏  举报