312.Burst Balloons

https://leetcode.com/problems/burst-balloons/discuss/76228/

Java D&C with Memoization

class Solution {
    public int maxCoins(int[] originalNums) {
        int n = originalNums.length;
        int[] nums = new int[n + 2];
        nums[0] = 1;
        nums[n + 1] = 1;
        for(int i = 0, j = 1; i < n; i++, j++){
            nums[j] = originalNums[i];
        }

        //update n
        n = n + 2;
        //memo[i][j] burst from i+1 to j-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;
    }
}
2-DP-
class Solution {
    public int maxCoins(int[] originalNums) {
        int n = originalNums.length;
        int[] nums = new int[n + 2];
        nums[0] = 1;
        nums[n + 1] = 1;
        for(int i = 0, j = 1; i < n; i++, j++){
            nums[j] = originalNums[i];
        }

        //update n
        n = n + 2;
        //memo[i][j] burst from i+1 to j-1
        int[][] dp = new int[n][n];
        for(int k = 2; k < n; k++){
            for(int left = 0; left < n - k; left++){
                int right = left + k;
                for(int i = left + 1; i < right; i++){
                    dp[left][right] = Math.max(dp[left][right], nums[left] * nums[i] * nums[right] + dp[left][i] + dp[i][right]);
                }
            }
        }
        return dp[0][n-1];
    }


}

results matching ""

    No results matching ""