這道題和198. 打家劫舍 一樣的
其實這道題和之前做過的 300.最長上公升子串行 很像
這道題解法非常多啊
我們設dp[i]為以i為終點的最大值,dp初始為nums
又由於不能連續選擇,則dp[i]一定和dp[i-1]無關
為了得到最大值,我們必須從[0,i-1)遍歷dp,記錄最大值,然後更新dp[i]=dp[i]+max
最後返回max(dp)就行了
這個執行效率說明應該有更好的方法
嘗試一下dfs解法,直接dfs的話應該會超時,要加上剪枝
這個裸的dfs超時了
class
solution
:def
massage
(self, nums: list[
int])-
>
int:
ifnot nums:
return
0 self.ans=
0 self.dfs(0,
0,nums)
return self.ans
defdfs(self,ind,temp,nums)
:if ind>=
len(nums)
: self.ans=
max(self.ans,temp)
return
# 選擇
self.dfs(ind+
2,temp+nums[ind]
,nums)
# 不選
self.dfs(ind+
1,temp,nums)
資料量其實並不大
[183,219,57,193,94,233,202,154,65,240,97,234,100,249,186,66,90,238,168,128,177,235,50,81,185,165,217,207,88,80,112,78,135,62,228,247,211]麻煩的就是剪枝條件怎麼找出來,嘗試乙個非常粗糙的剪枝,就是如果選擇了當前的元素,之後的元素總和都不大於的ans話就不選擇了
if temp+nums[ind]
+sum
(nums[ind+2:
])>self.ans:
# 選擇
self.dfs(ind+
2,temp+nums[ind]
,nums)
# 不選
self.dfs(ind+
1,temp,nums)
感覺更暴力了?,又卡在了乙個更長的樣例 leetcode 面試題17 16 按摩師
乙個有名的按摩師會收到源源不斷的預約請求,每個預約都可以選擇接或不接。在每次預約服務之間要有休息時間,因此她不能接受相鄰的預約。給定乙個預約請求序列,替按摩師找到最優的預約集合 總預約時間最長 返回總的分鐘數。注意 本題相對原題稍作改動 示例 1 輸入 1,2,3,1 輸出 4 解釋 選擇 1 號預...
LeetCode動態規劃 面試題17 16按摩師
乙個有名的按摩師會收到源源不斷的預約請求,每個預約都可以選擇接或不接。在每次預約服務之間要有休息時間,因此她不能接受相鄰的預約。給定乙個預約請求序列,替按摩師找到最優的預約集合 總預約時間最長 返回總的分鐘數。注意 本題相對原題稍作改動 示例 1 輸入 1,2,3,1 輸出 4 解釋 選擇 1 號預...
leetcode 面試題 17 16 按摩師
這道題其實和 leetcode 198.打家劫舍 是一樣的,典型的dp問題,dp i 表示在第 i 個請求到來後的總預約時間。我們對於第 i 個預約請求有兩種選擇 接和不接 接的話則表示他是從第 i 2 個請求過來的 因為不能接相鄰的請求 不接的話其總預約時間不變 和dp i 1 相同 所以狀態轉移...