python-leetcode-面試題 17.16. 按摩師

一.題目描述:
此題爲動態規劃入門題目,也是經典,與打家劫舍一樣.
在這裏插入圖片描述
二.題目分析:
讀題知輸入一個長度爲n的數組,表示n個預約,讓我們求到第n個預約的最大時長。

好,我們現在想下到第n個預約的最大時長dp[n]:1. 如果我們接第n個預約的話,由於相鄰的預約不能接,所以dp[n] = dp[n - 2] + nums[n](即等於到第n-2個預約的最大時長 + 第n個預約的時長); 2. 反之如果我們不接第n個預約的話,那麼dp[n] = d[n - 1](即等於到第n - 1個預約的最大時長)。

於是,我們得到了狀態轉移方程:dp[i] = max(dp[i - 1], dp[i - 2] + nums[i])

ok,接下來代碼部分就簡單了,照着狀態轉移方程遞推就行了(邊界條件別忘了處理)。

        n = len(nums)
        if n == 0:
            return 0

        dp0, dp1 = 0, nums[0]
        for i in range(1, n):
            tdp0 = max(dp0, dp1)   # 計算 dp[i][0]
            tdp1 = dp0 + nums[i]   # 計算 dp[i][1]
            dp0, dp1 = tdp0, tdp1
        
        return max(dp0, dp1)

優化代碼1:

        yes, no = 0, 0
        for num in nums:
            yes, no = num + no, max(yes, no)
        return max(yes, no)

優化代碼2:

class Solution:
    def massage(self, nums: List[int]) -> int:   
        last,now=0,0
        for num in nums:
            last,now=now,max(last+num,now)
        return now
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章