已解决
leetcode做题笔记213. 打家劫舍 II
来自网友在路上 168868提问 提问时间:2023-11-05 15:38:49阅读次数: 68
最佳答案 问答题库688位专家为你答疑解惑
你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金。这个地方所有的房屋都 围成一圈 ,这意味着第一个房屋和最后一个房屋是紧挨着的。同时,相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警 。
给定一个代表每个房屋存放金额的非负整数数组,计算你 在不触动警报装置的情况下 ,今晚能够偷窃到的最高金额。
示例 1:
输入:nums = [2,3,2] 输出:3 解释:你不能先偷窃 1 号房屋(金额 = 2),然后偷窃 3 号房屋(金额 = 2), 因为他们是相邻的。
示例 2:
输入:nums = [1,2,3,1] 输出:4 解释:你可以先偷窃 1 号房屋(金额 = 1),然后偷窃 3 号房屋(金额 = 3)。偷窃到的最高金额 = 1 + 3 = 4 。
示例 3:
输入:nums = [1,2,3] 输出:3
思路一:动态规划
c解法
int rob(int* nums, int numsSize){int dp[numsSize];if (numsSize == 0) return 0;if(numsSize==1)return nums[0];if(numsSize==2)return fmax(nums[0],nums[1]);int i, a[numsSize], b[numsSize];a[0] = nums[0];a[1] = nums[0];b[0] = 0;b[1] = nums[1];for(i = 2; i < numsSize; i++) {a[i] = fmax(a[i-1], a[i-2] + nums[i]);b[i] = fmax(b[i-1], b[i-2] + nums[i]);}return fmax(a[numsSize-2], b[numsSize-1]);}
分析:
本题为动态规划经典问题之一:打家劫舍,找出状态方程a[i] = fmax(a[i-1], a[i-2] + nums[i]);因为不能偷相邻房屋,所以偷的金额最大有两种可能:从第一个开始和第二个开始,分别计算两种情况的最大金额再比较两个金额即可得到答案
总结:
本题考察动态规划的应用,分别考虑从第一和第二个开始的情况即可解决
查看全文
99%的人还看了
相似问题
猜你感兴趣
版权申明
本文"leetcode做题笔记213. 打家劫舍 II":http://eshow365.cn/6-32796-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!