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.\n", s.rob(vec)); 40 return 0; 41 }