【区间dp】戳气球

在这里插入图片描述
以两个数作为左右端点,找出最优解中它们中间那个戳破的气球,中间这个气球把整个队列分为了2部分,要想让中间这个气球和2个端点靠在一起,就需要先把分开的2部分的气球戳破。

dp[i][j]表示i~j最大值,i,j不戳破。 比如k气球在i,j之间时(i,k,j)被戳破,那么要先戳破i,k、k,j之间的气球,所以dp[i][j]=dp[i][k]+dp[k][j]+nums[i]*nums[k]*nums[j]

在这里插入图片描述

class Solution {
public:
    // dp[l][r]:不戳破l、r,戳破(l,r)之间所有气球,能获得的最大金币
    int maxCoins(vector<int>& nums) {      
        nums.insert(nums.begin(), 1);
        nums.emplace_back(1);
        int n = nums.size();
        vector<vector<int>> dp(n, vector<int>(n, 0));
        for(int len = 3; len <= n; len++){
            for(int l = 0; l <= n - len; l++){
                int r = l + len - 1;
                for(int mid = l + 1; mid < r; mid++){
                    dp[l][r] = max(dp[l][mid] + dp[mid][r] + nums[l] * nums[mid] * nums[r], dp[l][r]);
                }
            }
        }
        return dp[0][n - 1];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

bugcoder-9905

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值