leetcode 面試題 17 16 按摩師

2021-10-04 09:01:26 字數 1908 閱讀 4872

這道題和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 相同 所以狀態轉移...