Burst Balloons解题报告

来源:互联网 发布:wind金融数据 编辑:程序博客网 时间:2024/05/22 05:53

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];    }};


0 0
原创粉丝点击