【发布时间】:2016-03-24 12:25:06
【问题描述】:
我正在尝试查找列表中非连续元素的最小总和, 每次我可以跳一个或两个单元格。 第一个单元格不计入总和。
实现必须包括递归和记忆。我尝试实现这样的方法,但不幸的是,它实际上并没有使用 memoization 并且它不适用于某些示例。
我的代码如下所示:
def optimal_cruise_seasick(toilet_prices):
prices_dict = {}
return optimal_cruise_seasick_mem(toilet_prices, 0, len(toilet_prices), prices_dict)
def optimal_cruise_seasick_mem(prices_lst, start, end, dic):
if (start,end) in dic:
return dic[(start,end)]
if(start + 1 == end or start + 2 == end):
return prices_lst[end-1]
min_cost = prices_lst[end-1]
i = start + 1
while(i < end - 1):
one = optimal_cruise_seasick_mem(prices_lst, i, i+1, dic)
two = optimal_cruise_seasick_mem(prices_lst, i, i+2, dic)
if (one <= two):
min_cost += one
i += 1
else:
min_cost += two
i += 2
dic[(start,end)] = min_cost
return min_cost
我尝试为toilet_prices = [20,40,60,80,100,70,50,30,10,30] 运行它。
它返回 320 而不是 250 (40,80,70,30,30)。我应该如何修复我的代码以使其按要求工作?
谢谢!
【问题讨论】:
-
您未充分说明您的问题。 40、100、30 是合法的序列吗? (从 40 开始,跳过 2、100、跳过 2、30、跳过 2、列表末尾。)如果你根本不计算总和中的 20,为什么不只是切断价格的第一个元素列表开始?
-
@Galc127,你能再添加一些预期的输出吗
-
哦,现在我看你的代码,我发现当你在标题中说“非连续”时,你实际上并不是说不连续,因为你可以,事实上有连续列表中的元素计入总和。
-
@senshin,它不是跳过,而是去,因此从 40 移动到单元格将移动到 80。例如,一个合法的序列可能是(从 40 开始,移动 2、80、移动 1 , 100, 移动 2, 50, 移动 2, 10, 移动 1, 30, 结束)。
-
好的,那么 40、80、70、30、10 怎么样 - 产生 230?那合法吗? (从 40 开始,第 2 步,第 80 步,第 2 步,第 70 步,第 2 步,第 30 步,第 1 步,第 10 步,第 2 步,列表末尾)
标签: python-3.x recursion memoization