leetcode 增維來消除後效性 按摩師題解

2021-10-04 08:52:38 字數 1228 閱讀 5969

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

示例 1:

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

輸出: 4

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

首先以每一天當作乙個狀態,而乙個特定的狀態i,他的最優值是受到i-1影響的。那這個最優值我們怎麼定義呢?容易看出,每乙個狀態的可能有兩種:選擇該序列值,不選擇該序列值,我們分別將其定義為dp[i][1],dp[i][0]。

至於為什麼採用增維,我覺得liweiwei大佬解釋的很讓我耳目一新。

由上的分類,我們可以討論出題目的狀態轉移方程:

不接受當前預約:dp[i][0]=max(dp[i-1][0],dp[i-1][1])

接受當前預約:dp[i][1]=dp[i-1][0]+nums[i]

其中不接受i預約時,第i-1天的預約可接受也可拒絕,故選擇二者之中的最大值。接受當前預約時,第i-1天的預約必然不能接受,故當前最優值就等於dp[i-1][0]與當前序列值nums[i]的和。

討論出狀態轉移方程之後,就要考慮初始化,和最終值的問題。

很明顯,在第一天的時候,dp[0][0]=0,dp[0][1]=nums[0] ,

注意!:c++在這裡動態申請二維陣列,如果空出dp[0][0]而直接用dp[1][0]的話會出現執行錯誤!!!

最終僅需輸出dp[n-1][0]和dp[n-1][1]的最大值

**如下:

class

solution

return

max(dp[n-1]

[0],dp[n-1]

[1])

;}};

事實上,上述方法的增維可以直接用一維陣列來替代,我們這樣考慮:

仍然以dp[i]為第i天的最優值,如果選擇i,那麼它必然是從i-2轉移過來;如果不選擇i,那麼它必然是從i-1轉移過來,故狀態轉移方程如下:dp[i]=max(dp[i-2]+nums[i],dp[i-1])

在上述方法的基礎上可以利用滾動陣列對解法的空間進行壓縮,具體實現(以及方法二的**)請參考:甜姨的解法

ps:菜雞的第一篇部落格啊!!值得紀念!!(撒花)

同時也希望通過分享來增

同時也希望通過分享來增 同時也希望通過分享來增 同時也希望通過分享來增 同時也希望通過分享來增 同時也希望通過分享來增 同時也希望通過分享來增 同時也希望通過分享來增 同時也希望通過分享來增 同時也希望通過分享來增 同時也希望通過分享來增 同時也希望通過分享來增 同時也希望通過分享來增 同時也希望通...

二維資料用三維表達來表現

這次要做的是二維資料實現三維表達,我們要弄的操作如下 例如一 圍欄的操作,首先我們先加載入資料,之後檢視屬性 第一 調整高度模式 風格設定,高度模式選擇相對地面,底部高程,拉伸高度 第二 三維貼圖管理 側面貼圖 實際大小,側面貼圖橫向重複 例2 建築物的操作,頂面設定。三維貼圖管理 側面紋理路徑,實...

leetcode 實現一維max pooling

思路有點像滑動視窗最大值。對乙個一維陣列做核為k的max pooling,步長為1,並寫出時間複雜度 思路 使用乙個雙端佇列 deque 作為輔助空間,其中內容為陣列的index。首先處理index從0到size 1 size為核長 如果deque空,直接壓入當前index到佇列尾部,否則對比佇列尾...