力扣 312. 戳气球 区间dp

129 篇文章 2 订阅
10 篇文章 0 订阅

https://leetcode-cn.com/problems/burst-balloons/
在这里插入图片描述

思路:设 d p [ i ] [ j ] dp[i][j] dp[i][j]表示戳破区间 [ i , j ] [i,j] [i,j]的所有气球所能获得的最大硬币数。为了方便处理,我们在数组开头和结尾各放入一个 1 1 1,设数组原来有 n n n个元素,显然答案为 d p [ 1 ] [ n ] dp[1][n] dp[1][n]。那么对于区间 [ i , j ] [i,j] [i,j],我们需要枚举所有的划分方案,设中断点为 k k k,则有: d p i , j = m a x ( d p i , k − 1 + d p k + 1 , j + a i − 1 ∗ a k ∗ a j + 1 ) dp_{i,j}=max(dp_{i,k-1}+dp_{k+1,j}+a_{i-1}*a_{k}*a_{j+1}) dpi,j=max(dpi,k1+dpk+1,j+ai1akaj+1) k k k的取值范围为 [ i , j ] [i,j] [i,j]。所以复杂度为 O ( n 3 ) O(n^3) O(n3)

class Solution {
public:
    int dp[505][505];
    int maxCoins(vector<int>& nums) {
        int n=nums.size();
        nums.insert(nums.begin(),1);
        nums.push_back(1);
        for(int i=1;i<=n;i++)
            dp[i][i]=nums[i-1]*nums[i]*nums[i+1];
        for(int len=2;len<=n;len++)
        {
            for(int i=1;i+len-1<=n;i++)
            {
                int j=i+len-1;
                for(int k=i;k<=j;k++)
                    dp[i][j]=max(dp[i][j],dp[i][k-1]+dp[k+1][j]+nums[i-1]*nums[k]*nums[j+1]);
            }
       }
        return dp[1][n];
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值