有n个气球,编号为0
到n-1
,每个气球都有一个分数,存在nums
数组中。每次吹气球i可以得到的分数为nums[left] * nums[i] * nums[right]
,left和right分别表示i
气球相邻的两个气球。当i气球被吹爆后,其左右两气球即为相邻。要求吹爆所有气球,得到最多的分数。
样例
给出 [4, 1, 5, 10]
返回 270
nums = [4, 1, 5, 10] burst 1, 得分 4 * 1 * 5 = 20
nums = [4, 5, 10] burst 5, 得分 4 * 5 * 10 = 200
nums = [4, 10] burst 4, 得分 1 * 4 * 10 = 40
nums = [10] burst 10, 得分 1 * 10 * 1 = 10
总共的分数为 20 + 200 + 40 + 10 = 270
def Search(dp,nums,start,end):
if dp[start][end]!=-1:
return dp[start][end]
res=0
for i in range(start,end+1):
mid=nums[start-1]*nums[i]*nums[end+1]
right=Search(dp,nums,i+1,end)
left=Search(dp,nums,start,i-1)
res=max(res,mid+left+right)
dp[start][end]=res
return res
class Solution:
"""
@param: nums: A list of integer
@return: An integer, maximum coins
"""
def maxCoins(self, nums):
# write your code here
l=len(nums)
dp=[[-1 for i in range(l+2)] for i in range(l+2)]
numsplus=[0 for i in range(l+2)]
numsplus[0]=1
numsplus[-1]=1
for i in range(0,l):
numsplus[i+1]=nums[i]
result = Search(dp,numsplus,1,l)
print dp
return result