给定n个气球,索引从0到n-1。每个气球都涂有一个由数组nums表示的数字。你被要求爆破所有的气球。如果你爆裂气球我会得到nums [left] * nums [i] * nums [right]硬币。这里左边和右边是i的相邻指数。爆发后,左右相邻。
通过明智地爆破气球找到你可以收集的最大硬币。
nums = [3,1,5,8] - > [3,5,8] - > [3,8] - > [8] - > [] 硬币= 3 * 1 * 5 + 3 * 5 * 8 + 1 * 3 * 8 + 1 * 8 * 1 = 167
我正在抽出一些测试用例。
想知道如何改善?请只给我提示。
class Solution(object):
def recursion(self, nums, index, dp):
r = -1
if not nums:
return 0
if len(nums) == 1:
return nums[0]
if str(nums) in dp:
return dp[str(nums)]
if index >= len(nums):
return 0
for i in range(len(nums)):
if i == 0:
r = max(r, nums[i]*nums[i+1] + self.recursion(nums[0:i]+nums[i+1:][:], i, dp))
elif i == len(nums)-1:
r = max(r, nums[i-1]*nums[i] + self.recursion(nums[0:i]+nums[i+1:][:], i, dp))
else:
r = max(r, nums[i-1]*nums[i]*nums[i+1] + self.recursion(nums[0:i]+nums[i+1:][:], i, dp))
dp[str(nums)] = r
return r
def maxCoins(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
return self.recursion(nums, 0, {})
答案 0 :(得分:1)
提示:尽量避免在每次递归中复制列表。
p.s:我非常确定这是一个时间复杂度为O(n ^ 3)的动态编程解决方案。