198. House Robber 打家劫舍 code

You are a professional robber planning to rob houses along a street. Each house has a certain amount of money stashed, the only constraint stopping you from robbing each of them is that adjacent houses have security system connected and it will automatically contact the police if two adjacent houses were broken into on the same night.

Given a list of non-negative integers representing the amount of money of each house, determine the maximum amount of money you can rob tonight without alerting the police.

Example 1:

Input: [1,2,3,1]
Output: 4
Explanation: Rob house 1 (money = 1) and then rob house 3 (money = 3).
Total amount you can rob = 1 + 3 = 4.

Example 2:

Input: [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个房间盗取财宝,除了当前第i个房间盗取财宝外,只能在前i-2个房间盗取财宝;
  2. 若不选择第i个房间盗取财宝,则相当于只考虑前i-1个房间盗取财宝。

上面是什么思想呢?分治思想。

动态规划的解法:

  1. 确认原问题与子问题:
    原问题为求n个房间的最优解,子问题为求前1个房间、前2个房间、… 前n-1个房间的最优解。

  2. 确认状态:
    第i个状态即为前i个房间能够获得的最大财宝(最优解)。

  3. 确认边界状态的值:
    前1个房间的最优解,第1个房间的财宝; 前2个房间的最优解,第1、 2个房间中较大财宝的。

  4. 确定状态转移方程:
    (1)选择第i个房间: 第i个房间+前i-2个房间的最优解;
    (2)不选择第i个房间: 前i-1个房间的最优解。

python实现

# 动态规划
def houseRobber(nums):
    house = {}
    if len(nums) <= 0:
        return 0
    elif len(nums) == 1:
        return nums[0]
    elif len(nums) == 2:
        return max(nums[0],nums[1])
    else:
        for i in range(2,len(nums)):
            house[0] = nums[0]
            house[1] = max(nums[0],nums[1])
            house[i] = max(house[i-1], house[i-2]+nums[i])
        return house[i]
nums2 = [2,7,9,3,1]
print(houseRobber(nums2))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值