当前位置:首页 > 编程笔记 > 正文
已解决

leetcode做题笔记198. 打家劫舍

来自网友在路上 142842提问 提问时间:2023-10-22 00:02:05阅读次数: 42

最佳答案 问答题库428位专家为你答疑解惑

你是一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警

给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。

思路一:动态规划

c语言解法

int rob(int* nums, int numsSize){if (numsSize == 1) {return nums[0];}int dp[numsSize];dp[0] = nums[0];dp[1] = fmax(nums[0],nums[1]);for(int i = 2;i<numsSize;i++){dp[i] = fmax(dp[i-1],dp[i-2]+nums[i]);}return dp[numsSize-1];
}

c++解法

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

分析:

本题算动态规划的一道经典例题,理解前后关系后利用动态规划可解决,状态方程为  dp[i] = max(dp[i - 2] + nums[i], dp[i - 1]);即后一位所能偷的最大金额为前一位的最大金额和前两位的最大金额加上当前金额,可依据此题求解其他相似类型的题如:打家劫舍Ⅱ等

总结:

本题考察动态规划的应用,利用动态规划将前一天的最大金额作为求解下一天的条件得到答案,除此之外还可用记忆化递归来进行查找

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"leetcode做题笔记198. 打家劫舍":http://eshow365.cn/6-21140-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!