FlyingCode

导航

 

leetcode312:

https://leetcode.com/problems/burst-balloons/#/description

 

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 rightare 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

原文链接:

http://blog.csdn.net/xyqzki/article/details/50255345

 

代码:

class Solution(object):
    def maxCoins(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        if len(nums) == 0: return 0
        nums = [1] + nums + [1]#这里可以像ref一样,把nums里面的0排除掉
        size = len(nums)
        dp = [[0]*len(nums) for x in range(len(nums))]#这样初始化,[0]*len(nums)是[0,0,0...]

        for k in xrange(2, size):
            for i in xrange(size - k):
                j = i + k
                p = i + 1
                while p < j:
                    dp[i][j] = max(dp[i][j], dp[i][p] + dp[p][j] + nums[i]*nums[p]*nums[j])
                    p += 1
        return dp[0][size - 1]

一开始我自己的想法是把这个问题转化为背包问题

开始时气球队列为空,从0到n依次加入气球

对每个新加入的气球有如下选项:最先爆炸和在先前的某一个气球爆炸后爆炸

但是经过思考发现这样的思路难以实现.要求对于每一个部分记录详细的爆炸轨迹,时间开销十分昂贵

看到xyqzki的攻略后豁然开朗

 

 

dp[l][r]表示扎破(l, r)范围内所有气球获得的最大硬币数,不含边界

dp矩阵所有初值置0

因为计算的value不含边界

所以开始的时候长度为3 即 0-2 1-3 2-4

左边界为l 右边界为r 访问的值为i

对于每一个i 考虑: 当i为最后一个爆炸的气球时value为多少,判断是否更新dp[l][r]的值

当i最后爆炸时,所产生的value为num[i]*num[l]*num[r]+dp[l][i]+dp[i][r]

红字部分是因为i最后爆炸而扎破的气球不包含边界,所以i爆炸时边界lr必定还存在而(l,r)中除了i的气球已经全部爆炸,所以i爆炸时产生的局部value为红字部分

 

这题题解看完总算对dp有了点感觉了 

posted on 2017-06-26 18:07  hhbeast  阅读(158)  评论(0)    收藏  举报