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))

猜你喜欢

转载自blog.csdn.net/Frank_LJiang/article/details/106149969
今日推荐