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)
    }
  • 相关阅读:
    npm registry
    JS函数addEventListener的浏览器差异性封装
    C# WinForm 异步执行耗时操作并将过程显示在界面中
    在server 2008/2003中 取消对网站的安全检查/去除添加信任网站
    SQL语句中将Datetime类型转换为字符串类型
    未在本地计算机上注册 Microsoft.Jet.OLEDB.4.0 提供程序
    当应用程序不是以 UserInteractive 模式运行时显示模式对话框或窗体是无效操作
    TFS2012常见问题及解答
    笔记《Hbase 权威指南》
    读Java 804
  • 原文地址:https://www.cnblogs.com/william-cheung/p/5371856.html
Copyright © 2011-2022 走看看