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

想法:弄清楚遞歸關係,找動態規劃的遞歸關係。

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