Python 爆炸的阳台在leetcode中超时
给定n个引出序号,索引范围为0到n-1。每个气球上都画有一个由数组nums表示的数字。你被要求炸毁所有的气球。如果你的气球爆了,你会得到nums[左]*nums[i]*nums[右]硬币。这里左和右是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 我有时间做一些测试用例 想知道如何改进吗?请只给我一些提示Python 爆炸的阳台在leetcode中超时,python,algorithm,recursion,memoization,Python,Algorithm,Recursion,Memoization,给定n个引出序号,索引范围为0到n-1。每个气球上都画有一个由数组nums表示的数字。你被要求炸毁所有的气球。如果你的气球爆了,你会得到nums[左]*nums[i]*nums[右]硬币。这里左和右是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 我有时间做一些测试用例 想知道如何改进吗?请只给我一些提示 c
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, {})
提示:尽量避免在每个递归中复制列表
p、 我很确定有一个动态规划解决方案的时间复杂度是O(n^3) 也许
矩阵链乘法问题的DP解决方案可能会给出一些想法如果代码有效,您可以将其发布在Codereview上作为替代方案。