美文网首页
312. Burst Balloons

312. Burst Balloons

作者: SummerDreamEve | 来源:发表于2018-04-19 10:19 被阅读0次

    思路

    把大问题化成递归的小问题,最后一步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

          本文链接:https://www.haomeiwen.com/subject/hhgikftx.html