Burst Balloons解题报告

https://leetcode.com/problems/burst-balloons/

这道题我一直不知道怎么做,后来看了别人的答案。其实这就是用了dp的记事簿的方法,dp[i][j]表示i到j这个区间的最大取值。但是这个怎么算呢?还是得懂i到j之间一个一个的算。那这样想岂不是应该是回溯法?但是回溯法容易把一个问题重复计算多变,从而造成时间和空间的浪费。所以用记事簿法是比较合适的。
dp[i][j]=max(dp[i][j],dp[i][x-1]+nums[i-1]*nums[x]*nums[x][j+1]+dp[x+1][j])
这里还需要考虑遍历方向的问题,i是从小到大,j是从大到小,所以这是一个很典型的三角形的递归问题:
将数组分层,然后一层一层的遍历。

class Solution {
public:
    int maxCoins(vector<int>& nums) {
        if(nums.size()==0) return 0;
        int n=nums.size();
        nums.insert(nums.begin(),1);
        nums.insert(nums.end(),1);
        vector<vector<int> > dp(n+2,vector<int>(n+2,0));
        for(int i=1;i<=n;i++){
            for(int left=1;left<=n-i+1;left++){
                int right=i+left-1;
                for(int k=left;k<=right;k++){
                    dp[left][right]=max(dp[left][right],nums[left-1]*nums[k]*nums[right+1]+dp[left][k-1]+dp[k+1][right]);
                }
            }
        }
        return dp[1][n];
    }
};


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值