【发布时间】:2014-08-05 19:02:21
【问题描述】:
我正在为软件开发人员面试做准备,并试图了解如何应用动态编程。我知道一个问题必须满足两个标准——有一个最优的子结构和重叠的子问题。举一个例子,你有一个函数 f(L),它接受一个整数列表 L 并将它映射到另一个整数(例如,f([17, 5, 2, 12] = 35) 你将如何应用动态规划到找到最大值?
例子
L = [17, 5, 2, 12, 9]
你可以有多种f()的组合:
f([17]) + f([5]) + f([2, 12, 19])
f([17]) + f([5, 2]) + f([12, 19])
我通过计算列表中每个元素的 f() 来接近它,例如 f([17])。然后是每两个元素,例如 f([17, 5]),然后是每三个元素,f([5, 2, 12]),等等。然后我将这些值映射到哈希表。接下来,我尝试了 f() 的所有组合以找到最大值。我认为这种方法并不优雅而且有点尴尬。关于如何处理的任何想法?
【问题讨论】:
-
传递给 f 的值必须在初始列表中连续定位还是允许任意组合?
-
@user2040251 数字必须是连续的。如果没有,则通过 5 个数字的排列更容易解决。
-
@donatello 是的,基本上,如果答案是 f([17]) + f([5, 2, 12]) + f([19]) 你如何使用动态规划来获得这个答案。
-
dp[1] = f([17]),然后 dp[4] 将是 dp[1] + f([5, 2, 12]),最后是 dp[5] = dp[4] + f([19])。当然,也可以计算 dp 的其他值。
标签: algorithm dynamic-programming