leetcode312戳气球

leetcode 312 Burst Balloons

Posted by BY on July 19, 2020

前言

持续更新了

正文

问题来源

本问题来自leetcode上的312题。

问题描述

有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。
现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球。
求所能获得硬币的最大数量。

示例 1:

输入: [3,1,5,8]
输出: 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

分析:

矩阵连乘问题,要注意的是左右边界要加上为1的单元,并且是连乘最大的问题。

func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}

func maxCoins(nums []int) int {
    cnums := make([]int, 0, len(nums)+2)
    cnums = append(cnums, 1)
    cnums = append(cnums, nums...)
    cnums = append(cnums, 1)
    n := len(nums)+2
    dp := make([][]int, len(nums)+2)
    for i := 0; i < n; i++ {
        dp[i] = make([]int, n)
    }
    for r := 2; r < n; r++ {
        for i := 1; i < n-r+1; i++ {
            j := r-1+i 
            tmp := 0
            for k := i; k < j; k++ {
                tmp = max(tmp, dp[i][k]+dp[k+1][j]+cnums[i-1]*cnums[k]*cnums[j])
            }
            dp[i][j] = tmp
        }
    }
    return dp[1][n-1]
}

总结:

勤思考。

结语

不管怎么样好好加油。