zoukankan      html  css  js  c++  java
  • [LeetCode] Burst Ballons

    Given n balloons, indexed from 0 to n-1. Each balloon is painted with a number on it represented by array nums. You are asked to burst all the balloons. If the you burst balloon i you will get nums[left] * nums[i] * nums[right] coins. Here left and right are adjacent indices of i. After the burst, the left and right then becomes adjacent.

    Find the maximum coins you can collect by bursting the balloons wisely.

    Note: 
    (1) You may imagine nums[-1] = nums[n] = 1. They are not real therefore you can not burst them.
    (2) 0 ≤ n ≤ 500, 0 ≤ nums[i] ≤ 100

    Example:

    Given [3, 1, 5, 8]

    Return 167

        nums = [3,1,5,8] --> [3,5,8] -->   [3,8]   -->  [8]  --> []
       coins =  3*1*5      +  3*5*8    +  1*3*8      + 1*8*1   = 167


    Denote dp[i][j] the maximum coins we collect by bursting ballons i~j (0 <= i <= j < n) , then the state transition function is:
      
      dp[i][j] = max { dp[i][k-1] + score(k) + dp[k+1][j] } for k in range [i, j]
    score[k] = nums[i-1] * nums[k] * nums[j+1]
      
    Innitialization: for any i and j , dp[i][j] = 0

    Time Complexity: O(n^3), Space Complexity: O(n^2)



    Sample Code in Golang

    burst_ballons.go
    package burst_ballons
    
    func MaxCoins(nums []int) int {
        n := len(nums)
        
        ar := make([]int, n + 2)
        for i := 1; i <= n; i++ {
            ar[i] = nums[i - 1]
        }
        ar[0], ar[n + 1] = 1, 1
    
        dp := make([][]int, n + 2)
        for i := 0; i < n + 2; i++ {
            dp[i] = make([]int, n + 2)
        }
    
        max := func(x, y int) int {
            if x > y {
                return x
            }
            return y
        }
    
        for i := n; i > 0; i-- {
            for j := i; j < n + 1; j++ {
                for k := i; k <= j; k++ {
                    scr := ar[i - 1] * ar[k] * ar[j + 1]
                    tmp := dp[i][k - 1] + scr + dp[k + 1][j]
                    dp[i][j] = max(dp[i][j], tmp)
                }
            }
        }
    
        return dp[1][n]
    }

      burst_ballons_test.go

    package burst_ballons
    
    import "testing"
    
    func check_answer(t *testing.T, v1, v2 int) {
        if v1 != v2 {
            t.Fatalf("wrong answer %d, expected %d", v1, v2)
        }
    }
    
    func TestMaxCoins(t *testing.T) {
        nums := []int{}
        n := MaxCoins(nums)
        check_answer(t, n, 0)
        
        nums = []int{5}
        n = MaxCoins(nums)
        check_answer(t, n, 5)
    
        nums = []int{3, 5, 8}
        n = MaxCoins(nums)
        check_answer(t, n, 152)
    
        nums = []int{3, 1, 5, 8}
        n = MaxCoins(nums)
        check_answer(t, n, 167)
    }
  • 相关阅读:
    题解-AtCoder ARC-083F Collecting Balls
    题解-CTS2019氪金手游
    题解-CTS2019随机立方体
    题解-APIO2019路灯
    题解-APIO2019桥梁
    vue-property-decorator 源码阅读
    如何在Vue项目中使用TypeScript
    在 Vue+TypeScript 项目中,如何配置 ESLint 和 Prettier
    JavaScript 原型和原型链
    pre-commit + imagemin 实现图片自动压缩
  • 原文地址:https://www.cnblogs.com/william-cheung/p/5371856.html
Copyright © 2011-2022 走看看