强盗问题动态规划详解

强盗抢劫一排房间(房间数大于3),每个房间都有钱,不能抢劫两个相邻的房间,要求抢的钱最多。每个房间的钱数用数组表示。数组如:[2,7,9,3,1]

详解:

我们简单分析情况。

1、当只有一间房子的时候,不用选,直接偷这间房子。

2、当有两件房子的时候,就需要选择其中钱多的房子。(max)

3、当房子数大于2时。就需要判断了,有以下两种情况。

(1)当偷到第i间房子时,也就不能碰第i-1间房子。此时的钱就是前i-2间房子的总金额加上第i间房子的金钱。(为什么是第i-1间,而不是第i-2间房子,因为,动态规划中,我们对于原数组,即存储房子序号的列表,是从前往后遍历的,因此只能是 i-1,大家看完全部后,会更有感触。)

(2)如果不碰第i间房子时,总金额就是前i-1的全部金额了。

我们可以写出公式来表示。

dp[]代表当前房子我们能偷到的最多金钱,nums[]代表当前房子本身具有的金额。

dp[0] = nums[0]   只有一间房屋,则偷窃该房屋

dp[1] = nums[1]  只有两间房屋,选择其中金额较高的房屋进行偷窃​
当房间数大于2的时候:
dp[i]=max(dp[i-2]+nums[i],dp[i-1])

import numpy as np
def rob(nums):
    n = len(nums)
    dp = np.zeros(n, dtype=np.int32)

    if n == 0:
        return 0
    elif n == 1:
        return nums[0]
    elif n == 2:
        return max(nums[0],nums[1])
    else:
        dp[0] = nums[0]
        dp[1] = max(nums[0],nums[1])
        for i in range(2,n):
            dp[i] = max(nums[i] + dp[i - 2],dp[i - 1])
        return dp[n-1]

nums = [2,7,9,3,1]
print('最大价值:',rob(nums))

 

你可能感兴趣的:(数据结构)