簡單 Leetcode 按摩師 入門dp

2021-10-04 09:07:46 字數 1127 閱讀 9981

乙個有名的按摩師會收到源源不斷的預約請求,每個預約都可以選擇接或不接。在每次預約服務之間要有休息時間,因此她不能接受相鄰的預約。給定乙個預約請求序列,替按摩師找到最優的預約集合(總預約時間最長),返回總的分鐘數。

示例 1:

輸入: [1,2,3,1]

輸出: 4

解釋: 選擇 1 號預約和 3 號預約,總時長 = 1 + 3 = 4。

示例 2:

輸入: [2,7,9,3,1]

輸出: 12

解釋: 選擇 1 號預約、 3 號預約和 5 號預約,總時長 = 2 + 9 + 1 = 12。

示例 3:

輸入: [2,1,4,5,3,1,1,3]

輸出: 12

解釋: 選擇 1 號預約、 3 號預約、 5 號預約和 8 號預約,總時長 = 2 + 4 + 3 + 3 = 12。

思路:甜姨詳解

讀題知輸入乙個長度為n的陣列,表示n個預約,讓我們求到第n個預約的最大時長。

dp中的元素代表某一時刻的總時長

我們現在想下到第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])

接下來**照著狀態轉移方程遞推就行了(邊界條件別忘了處理哦)。

int

rob(vector<

int>

& nums)

; dp[0]

= nums[0]

; dp[1]

=max

(nums[0]

, nums[1]

);for(

int i =

2; i < size; i++

)return dp[size -1]

;}

打家劫舍 按摩師

1.打家劫舍 56min 你是乙個專業的小偷,計畫偷竊沿街的房屋。每間房內都藏有一定的現金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統,如果兩間相鄰的房屋在同一晚上被小偷闖入,系統會自動報警。給定乙個代表每個房屋存放金額的非負整數陣列,計算你在不觸動警報裝置的情況下,能夠偷竊到的最...

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