《剑指offer》面试题90:环形房屋偷盗(python实现)

"""
题目:一条环形街道上有若干房屋。输入一个数组表示某条街道上的一排房屋内的财产数量。如果这条街道上相邻的两幢房屋被盗就会触发报警系统,
     请计算小偷在这条街道上个最多能偷多少财产。
例如:街道上5家的财产用数组[2,3,4,5,3]表示,如果小偷傲下标1和3的房屋内盗窃,那么他能偷到价值为8的财物,这是他能偷到的最多的财物。

分析:这道题我纯粹抄袭的作者的思路。就是把这个环,拆成两个单向的数组。
     思路是这样的,当小偷去第n-2号房屋偷盗时,那他必然不能去第0号房屋偷盗。当去第n-1号房屋偷盗时,必然不能去第1号房屋偷盗。
     (注意没有第n号房屋,因为是从0开始数的。)此时,这个问题就可以拆为两个子问题:
     一个问题是从第0号房屋到第n-2号房屋的数组的最多偷盗的财物,
     一个问题是从第1号房屋到第n-1号房屋的数组的最多偷盗的财物,
     然后求这两个问题的解的最大值,就是此问题的解。因此只需要在之前的房屋偷盗问题的代码上添加一个函数,将环境问题拆为两个子数组,
     然后求这两个子数组算出来的结果的最大值即可。
"""
def dp(houses,result_map,i):
    if i == 0:
        return houses[i]
    if i == 1:
        return max(houses[0],houses[1])
    if i == 2:
        return houses[0]+houses[2]
    else:
        if i in result_map:
            return result_map[i]
        else:
            max_value = max(dp(houses,result_map,i-2),dp(houses,result_map,i-3))+houses[i]
            result_map[i] = max_value
            return max_value
def steal_houses(houses):
    result_map = {}
    length = len(houses)
    max_value = max(dp(houses,result_map,length-1),dp(houses,result_map,length-2))
    return max_value

def ring_steal_houses(houses):
    length = len(houses)
    ring1 = houses[:length-1]
    ring2 = houses[1:length-2]
    max_value = max(steal_houses(ring1),steal_houses(ring2))
    print(max_value)

houses = [2,3,4,5,3]
ring_steal_houses(houses)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值