騰訊面試 戳氣球

2021-10-10 07:48:29 字數 1332 閱讀 4173

有 n 個氣球,編號為0 到 n-1,每個氣球上都標有乙個數字,這些數字存在陣列 nums 中。

現在要求你戳破所有的氣球。每當你戳破乙個氣球 i 時,你可以獲得 nums[left] * nums[i] * nums[right] 個硬幣。 這裡的 left 和 right 代表和 i 相鄰的兩個氣球的序號。注意當你戳破了氣球 i 後,氣球 left 和氣球 right 就變成了相鄰的氣球。

求所能獲得硬幣的最大數量。

說明:

你可以假設 nums[-1] = nums[n] = 1,但注意它們不是真實存在的所以並不能被戳破。

0 ≤ n ≤ 500, 0 ≤ nums[i] ≤ 100

示例:

輸入:[3,1,5,8]

輸出:167

解釋:nums = [3,1,5,8] --> [3,5,8] --> [3,8] --> [8] -->

coins = 315 + 358 + 138 + 181 = 167

//觀察執行思路

//遞迴最後會形成乙個型別樹的呼叫,從樹的底部開始返回,一次取最大的,借助圖形就很好理解了

func maxcoins(nums int) int

val[0], val[n+1] = 1, 1

//二維陣列

rec := make(int, n + 2)

for i := 0; i < len(rec); i++

}return solve(0, n + 1, val, rec)

}func solve(left, right int, val int, rec int) int

if rec[left][right] != -1

//0-5

for i := left + 1; i < right; i++

return rec[left][right]

}func max(x, y int) int

return y

}//動態規劃

func maxcoins(nums int) int

val := make(int, n + 2)

val[0], val[n+1] = 1, 1

for i := 1; i <= n; i++

for i := n - 1; i >= 0; i-- }}

return rec[0][n+1]

}func max(x, y int) int

return y

}

分治法「戳氣球」

最後的解法多半是貪心或者動態規劃,大概率動態規劃。但依照流程來看,找不到最優子結構。每次戳氣球都會影響之後戳的氣球,狀態太多了。比如同樣是戳數字5號,因為之前戳氣球的情況不同,左右鄰居不同,這意味著戳5號的情況不能復用。就這樣想著,完全找不到思路。後來發現是被正向思維給限制了 幹想也沒辦法,直接用動...

312 戳氣球 動態規劃

難度 困難 2020 7 19每日一題打卡 題目描述 解題思路 今天是抄答案而且還抄的迷迷糊糊的一天 知道要這樣做,但是仔細去想為什麼是這樣的,又說不出個所以然 首先在陣列左右兩端新增虛擬氣球節點,是不能被戳破的,這樣能方便處理邊界,而且保證總是有三個氣球相乘。然後注意動態規劃的順序,要從區間右邊開...

LeetCode312 戳氣球(難)

看了大概7 8分鐘,沒有思路。自己暴力的想法是n的階乘級別,也難寫。直接看題解,很巧妙,很驚嘆。參考講解 經典動態規劃 戳氣球 直接上 class solution dp i j 表示搓破 i,j 之間的氣球獲得的最大硬幣數量 邊界條件 dp i i 0,它們之間沒有氣球,dp i i 1 0 它們...