动态规划问题可以自上而下或自下而上的方式解决。
您已经描述了自下而上的版本。要执行自上而下的版本,请编写递归函数,然后添加缓存层,以便不重新计算已经计算的任何结果。在伪代码中:
cache = {}
function whatever(args)
if args not in cache
compute result
cache[args] = result
return cache[args]
这个过程被称为“memoization”,许多语言都有自动记忆东西的方法。
这里是一个Python实现这个具体的例子:
def prob_survival(daily_probabilities):
days = len(daily_probabilities)
days_needed = days/2
# An inner function to do the calculation.
cached_odds = {}
def prob_survival(day, rained):
if days_needed <= rained:
return 1.0
elif days <= day:
return 0.0
elif (day, rained) not in cached_odds:
p = daily_probabilities[day]
p_a = p * prob_survival(day+1, rained+1)
p_b = (1- p) * prob_survival(day+1, rained)
cached_odds[(day, rained)] = p_a + p_b
return cached_odds[(day, rained)]
return prob_survival(0, 0)
然后您可以如下调用它:
print(prob_survival([0.2, 0.4, 0.6, 0.8])
这是很简单的。递归“会下雨超过n/2天吗?”是“(今天下雨的可能性*其余日子里有2-1天会下雨的概率)+(今天没有下雨的概率*其余日子里n/2天下雨的概率)” 。显然,计算中的两个分支都有很多重叠。例如,可以设置dp矩阵,以便DP [i] [j]在剩下的j天内存储i天的降雨概率。 – aioobe
我想我已经开始掌握它了。非常感谢你! – remiss
不客气。我还写了一个精心制作的教程式的答案,以回答另一个受欢迎的入门级DP问题[这里](http://stackoverflow.com/a/6877313/276052),您可能会发现它具有教育意义。 – aioobe