开始打家劫舍
思路
打家劫舍是dp解決的經典問題之一
確定dp數組(dp table)以及下標的含義
dp[i]:考慮下標i(包括i)以內的房屋,最多可以偷竊的金額為dp[i]。
確定遞推公式
決定dp[i]的因素就是第i房間偷還是不偷。
如果偷第i房間,那么dp[i] = dp[i - 2] + nums[i] ,即:第i-1房一定是不考慮的,找出 下標i-2(包括i-2)以內的房屋,最多可以偷竊的金額為dp[i-2] 加上第i房間偷到的錢。
如果不偷第i房間,那么dp[i] = dp[i - 1],即考慮i-1這個房間,(注意這里是考慮,并不是一定要偷i-1房)
然后dp[i]取最大值,即dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);
dp數組如何初始化
從遞推公式dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);可以看出,遞推公式的基礎就是dp[0] 和 dp[1]
從dp[i]的定義上來講,dp[0] 一定是 nums[0],dp[1]就是nums[0]和nums[1]的最大值即:dp[1] = max(nums[0], nums[1]);
代碼如下:
vector<int> dp(nums.size(),0);dp[0]=nums[0];dp[1]=max(nums[1],nums[0]);確定遍歷順序
dp[i] 是根據dp[i - 2] 和 dp[i - 1] 推導出來的,那么一定是從前到后遍歷!
代碼如下:
for(int ii=2;ii<nums.size();ii++){dp[ii]=max(dp[ii-2]+nums[ii],dp[ii-1]);}舉例推導dp數組
以示例二,輸入[2,7,9,3,1]為例。
總結