步骤 1,满足dp算法的必要条件:最优子结构 2,定义递归函数, <-- 这步是关键, 3,自底向上计算递归函数 4,从计算过程保存的信息中,构造最优解的细节 很多实际问题需要从所有可能的情况中找出所需要的情况,有时这没有公式,唯一的办法是搜索、穷举,而随着问题规模扩大,单纯的穷举耗费问题规模的指数时间,对于大规模的问题,即使用计算机解决也很不可取。当问题具有最优子结构时,相同的子问题只需要计算一次,在自底向上的求最优解过程中,仅有子问题就能在可接受的时间复杂度内,计算出更接近最终最优解的子问题,最终完成最优解的计算。动态规划算法的这个特点:对子问题只计算一次,可以看做对穷举算法的一个很有效的剪枝。使得算法时间复杂度有很大很进。dp的自底向上计算过程是对最优子结构的运用:新问题被分解成一系列子问题,这些子问题的最优解都已求出,这时新问题的最优解面临一系列选择,从这一系列选择中构造新问题的最优解,依次类推以新问题为子问题构造更新的问题,直至原问题的最优解。这就是Dynamic Programming。 举例备忘 描述: 动态规划解法:
从上诉两种情况中,得出S(len,i,j),即:从所有(k,l)点对假设中得到的一系列S(len,i,j)的最小值。
综合以上分析,得到递归函数S和E:
S(len, i, j) = min { min { S(len - 1, x, y) : 所有不包含点i, j, k, l的S(len - 1, x, y) } + d(k, l) : 所有非i, j的点k, l } = S(len - 1, sub_i, sub_j) + d(new_i, new_j)
S式中对点的包含关系用E数组来记录,E数组也递归计算: E(len, i, j, k) = E(len - 1, sub_i, sub_j, k)(k为变量), 且 E(len, i, j, new_i) = 0 且 E(len, i, j, new_j) = 0
S式和E式就是该问题的一个dp解法的递归函数。
直觉上,S数组代表共有n^3/2个子问题,每个子问题由(n^2/2-n)个(k,l)假设计算得到,每个(k,l)假设)要考虑所有len-1的(n^2/2 - n)个子问题S(len-1, x, y),所以t = O(n^7)
剩下的3,4步骤已经很容易 复杂度: 时间7次方,空间4次方 !!!!!!!!!!!!!!!
实现:
|