198. 打家劫舍
Posted shayue
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了198. 打家劫舍相关的知识,希望对你有一定的参考价值。
题目描述:
你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你在不触动警报装置的情况下,能够偷窃到的最高金额。
示例1:
输入: [1,2,3,1]
输出: 4
解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。
示例2:
输入: [2,7,9,3,1]
输出: 12
解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。偷窃到的最高金额 = 2 + 9 + 1 = 12 。
算法:
动态规划,找到状态方程是重中之中。
代码:
1 #include <iostream> 2 #include <vector> 3 #include <algorithm> 4 using namespace std; 5 6 /*** 7 * dp[i]表示前i个最多能获取到的金额 8 * 状态转移方程: 9 * dp[i] = max(dp[i-1], dp[i-2]+nums[i]) 10 ***/ 11 class Solution { 12 public: 13 int rob(vector<int>& nums) { 14 int len = nums.size(); 15 if(len == 0) 16 return 0; 17 if(len == 1) 18 return nums[0]; 19 if(len == 2) 20 return max(nums[0], nums[1]); 21 22 int *dp = (int*)malloc(sizeof(int) * len); 23 dp[0] = nums[0]; 24 dp[1] = max(dp[0], nums[1]); 25 26 for(int i = 2; i < len; i++) 27 { 28 dp[i] = max(dp[i-1], dp[i-2]+nums[i]); 29 } 30 31 return dp[len-1]; 32 } 33 }; 34 35 int main() 36 { 37 vector<int> vec = {2,7,9,3,1}; 38 Solution s; 39 printf("小偷最多能偷到: %d. ", s.rob(vec)); 40 return 0; 41 }
以上是关于198. 打家劫舍的主要内容,如果未能解决你的问题,请参考以下文章
代码随想录算法训练营第四十八天 | 198.打家劫舍 213.打家劫舍II337.打家劫舍III