赞
踩
本篇内容为阅读《算法导论》动态规划算法设计时的一些理解和记录。建议大家去看原书,真的好。
动态规划有点像分治法,都是通过合并原问题的子问题的解来得到原问题的解。不同的是分治法将原问题划分为不相交的子问题,递归地解决子问题,然后组合它们的解来得到原问题的解。而动态规划需要原问题划分为有重叠的子问题,即其子问题又需要共同的子子问题。
当划分的子问题有重叠时,使用分治法会导致重叠子问题的重复计算。动态规划实际上就是通过存储子问题的解来避免这样的重复计算,这是动态规划的基本思想。
动态规划一般用于求一个最优解的问题,解决这样的问题包含四步:
这样直白的语言概括其实很难理解的,还需要根据例子来理解,《算法导论》中给出了几个例子,我们也借用他来记录一下。
将一根长度为 n 的铁棒进行分割,不同长度可以卖不同的价格(遵循一个价格表 P ),问可以卖出的最大的价格是多少?(一个最优解的问题)
设长度为 n 的铁棍通过切割最多能卖出的价格为 rn,第一次分割的长度为 i ,其余部分为 n-i。其中 i 的范围是 [1,n],那我们可以表示出 rn :
rn = max (pi + rn-i)
注意i 的范围是 [1,n],这里的max要求的是例如p1 + rn-1,p2 + rn-2,… 之类的最大值。
很显然,这是个递归,我们很容易写出代码(Go):
func cutRod(p []int, n int) int {
if n == 0 {
return 0
}
q := math.MinInt
for i := 1;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。