思路
把大问题化成递归的小问题,最后一步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
网友评论