Leetcode之Burst Balloons

题目:

Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by array nums. You are asked to burst all the balloons. If the you burst balloon i you will get nums[left] * nums[i] * nums[right] coins. Here left and right are adjacent indices of i. After the burst, the left and rightthen becomes adjacent.

Find the maximum coins you can collect by bursting the balloons wisely.

Note:

  • You may imagine nums[-1] = nums[n] = 1. They are not real therefore you can not burst them.
  • 0 ≤ n ≤ 500, 0 ≤ nums[i] ≤ 100

Example:

Input: [3,1,5,8]
Output: 167 
Explanation: nums = [3,1,5,8] --> [3,5,8] -->   [3,8]   -->  [8]  --> []
             coins =  3*1*5      +  3*5*8    +  1*3*8      + 1*8*1   = 167

代码:

方法一——递归法(超时了):

class Solution {
public:
map<vector<int>, int> m;
int maxCoins(vector<int>& nums) {

    if (m.count(nums))return m[nums];
    int len = nums.size();
    if (len == 0)return 0;
    int res = INT_MIN;
    for (int i = 0; i < len; i++) {
        int temp = nums[i];
        int left = i == 0 ? 1 : nums[i - 1];
        int right = i == len - 1 ? 1 : nums[i + 1];
        int temp_res = left * nums[i] * right;
        nums.erase(nums.begin() + i);
        temp_res += maxCoins(nums);
        res = max(res, temp_res);
        nums.insert(nums.begin() + i, temp);
    }
    m[nums] = res;
    return res;
}
};

思路:弄清临界条件,弄清每一步的操作,弄清是和谁比取max,记忆化搜索。记得vector的操作,insert和erase。

方法二——动态规划法:

代码:

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

想法:弄清楚递归关系,找动态规划的递归关系。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章