leetcode-198 打家劫舍
leetcode-198 打家劫舍
-
题目
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
-
解题思路
本体使用动态规划思想解答,所以需要列出状态转移方程。因该小偷会经过所有的房间,他每次经过一个房间,会有两种状态
- 可以偷【i】这个房间,则【i-1】这个房间没有被偷
- 不可以偷这个房间,则【i-1】这个房间被偷了
因此到达第【i】个房间时,他所能得到的现金为max({第【i-1】房间被偷时得到的现金},{第【i-2】房间被偷,再偷第i个房间得到的现金})
所以动态转移方程为 $ dp[i]=max(dp[i-1],dp[i-2]+nums[i]) $$
-
code
#include <iostream>
#include <vector>
using namespace std;
class Solution {
public:
int rob(vector<int>& nums) {
if (nums.size() == 0) {
return 0;
}
if (nums.size() == 1) {
return nums[0];
}
if (nums.size() == 2) {
return nums[0] > nums[1] ? nums[0] : nums[1];
}
int dp[100] = {0};
dp[0] = nums[0];
dp[1] = nums[0] > nums[1] ? nums[0] : nums[1];
for (int i = 2; i < nums.size(); i++) {
dp[i] =
dp[i - 1] > (dp[i - 2] + nums[i]) ? dp[i - 1] : (dp[i - 2] + nums[i]);
}
return dp[nums.size() - 1];
}
};
int main() {
return 0;
}