zoukankan      html  css  js  c++  java
  • leetcode刷题笔记312题 戳气球

    leetcode刷题笔记312题 戳气球

    源地址:312. 戳气球

    问题描述:

    有 n 个气球,编号为0 到 n-1,每个气球上都标有一个数字,这些数字存在数组 nums 中。

    现在要求你戳破所有的气球。如果你戳破气球 i ,就可以获得 nums[left] * nums[i] * nums[right] 个硬币。 这里的 left 和 right 代表和 i 相邻的两个气球的序号。注意当你戳破了气球 i 后,气球 left 和气球 right 就变成了相邻的气球。

    求所能获得硬币的最大数量。

    说明:

    你可以假设 nums[-1] = nums[n] = 1,但注意它们不是真实存在的所以并不能被戳破。
    0 ≤ n ≤ 500, 0 ≤ nums[i] ≤ 100
    示例:

    输入: [3,1,5,8]
    输出: 167
    解释: nums = [3,1,5,8] --> [3,5,8] --> [3,8] --> [8] --> []
    coins = 315 + 358 + 138 + 181 = 167

    //在原数组两侧添加哨兵 转化为DP问题
    //res[i][j]代表i, j内的气球全部射完
    //在i, j中选择K作为最后一个射击的气球计算
    object Solution {
        def maxCoins(nums: Array[Int]): Int = {
            val length = nums.length
            val newArr = nums.prepended(1).appended(1)
            val res = Array.fill(length+2, length+2)(0)
            for (len <- 3 to length+2) {
                for (i <- 0 to length+2-len){
                    val j = i + len - 1
                    for (k <- i+1 to j-1) {
                        res(i)(j) = math.max(res(i)(j), res(i)(k) + res(k)(j) + newArr(i)*newArr(j)*newArr(k))
                    }
                }
            }
            return res(0)(length+1)
        }
    }
    
    func maxCoins(nums []int) int {
        n := len(nums)
        nums = append(append([]int{1}, nums...), 1)
        res := make([][]int, n+2)
        for i := 0; i < len(res); i++{
            res[i] = make([]int, n+2)
        }
    
        for len := 3; len <= n+2; len++{
            for i := 0; i <= n+2-len; i++{
                j := i + len - 1
                for k := i + 1; k < j; k++ {
                    res[i][j] = max(res[i][j] , res[i][k] + res[k][j] + nums[i]*nums[j]*nums[k])
                }
            }
        }
    
    
        return res[0][n+1]
    }
    
    func max(a, b int) int {
        if a > b {
            return a 
        } else {
            return b
        }
    }
    
  • 相关阅读:
    poj 3253 Fence Repair (优先队列,哈弗曼)
    容斥原理 (转载)
    poj 1088 滑雪 DP(dfs的记忆化搜索)
    饭卡 01背包 + 贪心
    N分之一 竖式除法模拟
    poj2325 大数除法+贪心
    优先队列重载运算符< 以及初始化列表
    POJ 2718 Smallest Difference(贪心 or next_permutation暴力枚举)
    HASH算法
    字符串匹配算法——KMP算法
  • 原文地址:https://www.cnblogs.com/ganshuoos/p/14076845.html
Copyright © 2011-2022 走看看