198. House Robber
龙大是一个小偷,他跑到一条街上要偷一整排的家户,但是家户装有警报系统所以
你如果偷了这个家他的左右两边的家都会知道,求出龙大要怎么偷才能偷最多钱。
Example:
Input: nums = [2,7,9,3,1]
Output: 12
Explanation: Rob house 1 (money = 2), rob house 3 (money = 9) and rob house 5
(money = 1).
Total amount you can rob = 2 + 9 + 1 = 12.
思路:
1.因为偷了i位置就不能偷i-1位置,所以我们只要纪录不偷前一家和偷前一家哪一个
可以拿到更多钱就好,可以使用动态规划来维护这个数值。
2.dp(i)表示在第i个家的时候可偷到的最多钱,状态转移方程:
dp(i) = max(dp(i-1), dp(i-2)+nums(i))
3.因为状态转移方程要往前找两个,所以我们必须初始化dp(0)和dp(1)的数值,显然的
dp(0)一定是nums[0],而dp[1]会是max(nums[0], nums[1]),遇到长度小于2的case
则直接返回唯一的元素。
Java Code: