"""
题目:一条环形街道上有若干房屋。输入一个数组表示某条街道上的一排房屋内的财产数量。如果这条街道上相邻的两幢房屋被盗就会触发报警系统,
请计算小偷在这条街道上个最多能偷多少财产。
例如:街道上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)
《剑指offer》面试题90:环形房屋偷盗(python实现)
最新推荐文章于 2023-08-21 18:02:32 发布