312. Burst Balloons - LeetCode

Posted okokabcd

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了312. Burst Balloons - LeetCode相关的知识,希望对你有一定的参考价值。

Question

https://leetcode.com/problems/burst-balloons/description/

技术分享图片

Solution

题目大意是,有4个气球,每个气球上有个数字,现在依次打这4个气球(可以看成两边还各有一个气球即1,3,1,5,8,1),第一次打5这处气球,你的得分是左边气球上的数乘右边气球上的数再乘被打气球上的数。按任意顺序打这4个气球,求最终得分最高的值。

思考:正向思考

技术分享图片

反向思考:

技术分享图片

public int maxCoins(int[] nums) {
    // 假设输入是[3,1,5,8]

    // 构造一个新的气球数组[1,3,1,5,8,1]
    int[] fullNums = new int[nums.length + 2];
    fullNums[0] = 1;
    fullNums[fullNums.length - 1] = 1;
    for (int i = 1; i < fullNums.length - 1; i++) fullNums[i] = nums[i - 1];

    // 存储从a气球到b气球的最高得分,初始化为-1,由于b>=a所以存储一半就可以了
    int[][] result = new int[fullNums.length][fullNums.length];
    for (int i = 1; i < result.length; i++) {
        for (int j = i; j < result[0].length; j++) {
            result[i][j] = -1;
        }
    }

    // 相对于构造的数组 从1到4号气球才是我们要打的气球
    return getMax(fullNums, result, 1, fullNums.length - 2);
}

private int getMax(int[] fullNums, int[][] result, int begin, int end) {
    if (begin > end) return 0;

    // 如果不是初始值,说明已经计算过该值了,直接返回结果
    if (result[begin][end] != -1) return result[begin][end];

    // 最后结果有4种,最后打3或1或5或8这四种可能,比较取最大值
    for (int pos = begin; pos <= end; pos++) {
        int left = getMax(fullNums, result, begin, pos - 1);
        int mid = fullNums[begin - 1] * fullNums[pos] * fullNums[end + 1];
        int right = getMax(fullNums, result, pos + 1, end);
        int coin = left + mid + right;
        if (coin > result[begin][end]) result[begin][end] = coin;
    }
    return result[begin][end];
}

Reference

以上是关于312. Burst Balloons - LeetCode的主要内容,如果未能解决你的问题,请参考以下文章

[LeetCode] 312. Burst Balloons

LeetCode312. Burst Balloons

312. Burst Balloons

Leetcode 312. Burst Balloons

java 312. Burst Balloons(Recursive).java

java 312. Burst Balloons(Recursive).java