日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

开始打家劫舍

發布時間:2024/4/18 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 开始打家劫舍 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

思路

打家劫舍是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]為例。

class Solution { public:int rob(vector<int>& nums) {if(nums.size()==0) return 0;if(nums.size()==1) return nums[0];vector<int> dp(nums.size());dp[0]=nums[0];dp[1]=max(nums[1],nums[0]);for(int ii=2;ii<nums.size();ii++){dp[ii]=max(dp[ii-2]+nums[ii],dp[ii-1]);}return dp[nums.size()-1];} };

總結

以上是生活随笔為你收集整理的开始打家劫舍的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。