C++算法题解:房屋盗窃最大金额
C++算法题解:房屋盗窃最大金额
这篇文章将讲解如何使用C++解决一个经典的算法问题:房屋盗窃。
问题描述:
你是一名专业盗贼,计划盗窃沿街的房屋。每间房内都藏有一定的现金,但相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。
给定一个代表每个房屋存放金额的非负整数数组,计算你 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
示例:
-
输入: [1,2,3,1]* 输出: 4* 解释: 偷窃 1 号房屋 (金额 = 1) ,然后偷窃 3 号房屋 (金额 = 3)。 偷窃到的最高金额 = 1 + 3 = 4 。
-
输入: [2,7,9,3,1]* 输出: 12* 解释: 偷窃 1 号房屋 (金额 = 2), 偷窃 3 号房屋 (金额 = 9),接着偷窃 5 号房屋 (金额 = 1)。 偷窃到的最高金额 = 2 + 9 + 1 = 12 。
提示:
1 <= nums.length <= 100*0 <= nums[i] <= 400
解题思路:
这是一个典型的动态规划问题。我们可以使用动态规划的思想来解决。
- 定义状态: 假设
dp[i]表示偷取前i个房屋能够获得的最高金额。2. 状态转移方程: 对于第i个房屋,有两种选择: * 偷取第i个房屋: 则前一个房屋(第i-1个房屋)不能偷取,所以偷取前i个房屋能够获得的最高金额是dp[i-2] + nums[i]。 * 不偷取第i个房屋: 则偷取前i个房屋能够获得的最高金额是dp[i-1]。 因此,状态转移方程为:dp[i] = max(dp[i-2] + nums[i], dp[i-1])3. 边界条件: *dp[0] = nums[0](只有一间房屋,只能偷取这间) *dp[1] = max(nums[0], nums[1])(有两间房屋,选择金额较大的一间)4. 最终结果:dp[nums.size()-1](表示偷取完所有房屋后能获得的最大金额)
**C++代码:**cpp#include
using namespace std;
int rob(vector
代码解释:
- 代码首先处理了房屋数量为 0 或 1 的特殊情况。* 然后,创建了一个
dp数组来存储每个状态的结果。* 使用状态转移方程计算dp数组的值。* 最后返回dp[n-1],即为最终结果。
通过以上代码,就可以计算出不触动警报装置的情况下,一夜之内能够偷窃到的最高金额。
原文地址: https://www.cveoy.top/t/topic/cuG4 著作权归作者所有。请勿转载和采集!