题目描述
一个专业的小偷,计划偷窃沿街的房屋。每间房内都藏有一定的现金,影响小偷偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警。 给定一个代表每个房屋存放金额的非负整数数组 nums ,请计算 不触动警报装置的情况下 ,一夜之内能够偷窃到的最高金额。
核心思想是利用动态规划来避免重复计算,并且考虑到相邻房屋不能同时偷窃的约束条件。
解题思路
解法一:
这种解法采用了动态规划(Dynamic Programming, DP)的思想来解决“打家劫舍”问题,但它在传统DP解法的基础上增加了一些额外的状态来更清晰地表示问题。在这个解法中,定义了三个数组:dp
、f
和 g
,它们各自有不同的含义和用途。
数组定义
dp[i]
:到位置i
时(包括位置i
),可以抢到的最多钱。这个数组在最终答案的求解中并不是直接必要的,因为最终答案可以通过遍历f
或g
数组得到,但在这里它被用作一个中间变量来存储每个位置的最大收益。f[i]
:在位置i
选择抢时,到位置i
可以抢到的最多钱。这表示如果小偷决定抢第i
个房子,那么他应该抢到的最大金额。g[i]
:在位置i
不抢时,到位置i
可以抢到的最多钱。这表示如果小偷决定不抢第i
个房子,那么他应该抢到的最大金额。