312. Burst Balloons

思路

把大问题化成递归的小问题,最后一步burst是可以“知道”的:nums[-1]*nums[i]*nums[n],再往前递推,把数组分成i的左边和i的右边,这样左边右边求最大值互不干扰,用数组记录最大值,memo[left][right] 表示left到right这段的最大值。
除此之外,注意一下0值,原作者把0值事先去除了。

代码

public int maxCoins(int[] iNums) {
   int[] nums = new int[iNums.length + 2];
   int n = 1;
   for (int x : iNums) if (x > 0) nums[n++] = x;
   nums[0] = nums[n++] = 1;
   int[][] memo = new int[n][n];
   return burst(memo, nums, 0, n - 1);
}
public int burst(int[][] memo, int[] nums, int left, int right) {
   if (left + 1 == right) return 0;
   if (memo[left][right] > 0) return memo[left][right];
   int ans = 0;
   for (int i = left + 1; i < right; ++i)
       ans = Math.max(ans, nums[left] * nums[i] * nums[right] 
       + burst(memo, nums, left, i) + burst(memo, nums, i, right));
   memo[left][right] = ans;
   return ans;
}

参考:https://leetcode.com/problems/burst-balloons/discuss/76228/Share-some-analysis-and-explanations

你可能感兴趣的:(312. Burst Balloons)