LeetCode312. Burst Balloons

论坛 期权论坛 脚本     
匿名技术用户   2020-12-27 00:28   46   0

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 right then 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

本文主要参考博客:here。这道题让我再一次确认,在添加了某些边界条件后代码真的会变得非常简洁。

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP