開區間(i,j)最左邊索引 i,最右邊索引 j。這裏說開區間的意思是,我們只能戳爆 i 和 j 之間的氣球,i 和 j 不要戳。這個區間最後一個被戳爆的氣球就是k。(逆向思維)
前後填充1,[3,1,5]->[1,3,1,5,1]
,相當於前後兩個氣球不戳破,但是參與計算。
class Solution:
def maxCoins(self, nums: List[int]) -> int:
# 前後擴1
nums.append(1)
nums.insert(0,1)
length=len(nums)
dp=[[0]*(length) for i in range(length)]
# i從高到低,j從i+1到length左到右
for i in range(length-1,-1,-1):
for j in range(i+1,length):
for k in range(i+1,j):
# 只取所有組合中最大的
dp[i][j]=max(dp[i][j],dp[i][k]+dp[k][j]+nums[k]*nums[i]*nums[j])
return dp[0][-1]