我有一个递归解决方案,但是发现许多子问题被重复计算了。我需要MEMOIZATION的帮助。
这是问题陈述: 你是一名专业的抢劫犯,打算在街道上抢劫房屋。每个房子都藏有一定数量的钱,唯一限制你抢劫他们的是相邻的房屋有连接的安全系统,如果在同一晚上闯入两个相邻的房屋,它会自动联系警察。 给定一个表示每个房屋钱数的非负整数列表,确定今晚你可以在不警告警方的情况下抢到的最大金额。
示例: 输入: [2,7,9,3,1] 输出: 12 解释:抢劫第1个房子(钱=2),抢劫第3个房子(钱=9)和抢劫第5个房子(钱=1)。总共可以抢劫的金额=2 9+1=12。
另一个: 输入: [1,2,3,1] 输出: 4 解释:抢劫第1个房子(钱=1),然后抢劫第3个房子(钱=3)。总共可以抢劫的金额=1+3=4。
还有一个: 输入: [2, 1, 1, 2] 输出: 4 解释:抢劫第1个房子(钱=2),然后抢劫第4个房子(钱=2)。总共可以抢劫的金额=2+2=4。
现在,像我说的,我有一个完美的递归解决方案: 当我构建一个递归解决方案时,我不会太多思考。我只是试图理解更小的子问题。 选项1: 我添加当前索引中的值,并转到索引+2 选项2: 我不添加当前索引中的值,并从索引+1开始查找,最大金额=max(option_1,option_2)
我有一个名为
但是,我得到了错误的解决方案,结果是
这是问题陈述: 你是一名专业的抢劫犯,打算在街道上抢劫房屋。每个房子都藏有一定数量的钱,唯一限制你抢劫他们的是相邻的房屋有连接的安全系统,如果在同一晚上闯入两个相邻的房屋,它会自动联系警察。 给定一个表示每个房屋钱数的非负整数列表,确定今晚你可以在不警告警方的情况下抢到的最大金额。
示例: 输入: [2,7,9,3,1] 输出: 12 解释:抢劫第1个房子(钱=2),抢劫第3个房子(钱=9)和抢劫第5个房子(钱=1)。总共可以抢劫的金额=2 9+1=12。
另一个: 输入: [1,2,3,1] 输出: 4 解释:抢劫第1个房子(钱=1),然后抢劫第3个房子(钱=3)。总共可以抢劫的金额=1+3=4。
还有一个: 输入: [2, 1, 1, 2] 输出: 4 解释:抢劫第1个房子(钱=2),然后抢劫第4个房子(钱=2)。总共可以抢劫的金额=2+2=4。
现在,像我说的,我有一个完美的递归解决方案: 当我构建一个递归解决方案时,我不会太多思考。我只是试图理解更小的子问题。 选项1: 我添加当前索引中的值,并转到索引+2 选项2: 我不添加当前索引中的值,并从索引+1开始查找,最大金额=max(option_1,option_2)
money = [1, 2, 1, 1] #Amounts that can be looted
def helper(value, index):
if index >= len(money):
return value
else:
option1 = value + money[index]
new_index1 = index + 2
option2 = value
new_index2 = index + 1
return max(helper(option1, new_index1), helper(option2, new_index2))
helper(0, 0) #Starting of at value = 0 and index = 0
这个非常完美地运行了,并返回了正确的值 3
。
然后我尝试了一下记忆化。
money = [1, 2, 1, 1]
max_dict = {}
def helper(value, index):
if index in max_dict:
return max_dict[index]
elif index >= len(l1):
return value
else:
option1 = value + money[index]
new_index1 = index + 2
option2 = value
new_index2 = index + 1
max_dict[index] = max(helper(option1, new_index1), helper(option2, new_index2))
return max_dict[index]
helper(0, 0)
我有一个名为
max_dict
的字典,用于存储值。每次递归调用都会检查该值是否已存在,然后相应地获取它并将其打印出来。但是,我得到了错误的解决方案,结果是
2
而不是3
。我去了pythontutor.com
并输入了我的解决方案,但似乎无法得到递归树以及它在哪里失败了。
请问有人能够给我一个正确的记忆化实现,同时保持整体结构不变吗?换句话说,我不想改变递归函数的定义。