题解 | 能量项链(区间dp)

能量项链

https://www.nowcoder.com/practice/565e5812eeab4d8d8449adebcb6583ef

#牛客春招刷题训练营# + 链接

区间dp经典题啦

先套路复制一遍解环,然后用dp[i][j]表示第i颗到第j颗聚合完之后的最优值,每次枚举最后是哪两段聚合就可以

#include <iostream>
using namespace std;

using ll = long long;
const int mod=1e9+7;
const int N=210;
ll dp[N][N], a[N];

inline void getmax(ll &x, ll y)
{
    if (y>x) x=y;
}

int main() {
    int n,m;
    scanf("%d", &n);
    for (int i=1;i<=n;i++) {
        scanf("%lld", &a[i]);
        a[n+i]=a[i];
    }
    m = n+n;
    a[m+1]=a[1];
    a[m+2]=a[2];
    for (int i=1;i<=m;i++) dp[i][i+1]=a[i]*a[i+1]*a[i+2];
    for (int x=3;x<=n;x++) {
        for (int i=1,j=x;j<=m;i++,j++) {
            for (int k=i;k<j;k++) {
                getmax(dp[i][j], dp[i][k]+dp[k+1][j]+a[i]*a[j+1]*a[k+1]);
            }
        }
    }
    ll ans = 0;
    for (int i=1;i<=n;i++) {
        getmax(ans, dp[i][i+n-1]);
    }
    printf("%lld\n", ans%mod);
    return 0;
}

全部评论

相关推荐

不愿透露姓名的神秘牛友
06-05 04:14
已编辑
真烦好烦真烦:看着感觉好强啊,这都过不了吗
投递字节跳动等公司7个岗位 面试中的破防瞬间
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务