一.題目描述:
此題爲動態規劃入門題目,也是經典,與打家劫舍一樣.
二.題目分析:
讀題知輸入一個長度爲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