动态规划

来源:互联网 发布:胜通预算软件下载 编辑:程序博客网 时间:2024/03/29 21:32

动态规划是一种在数学计算机科学中使用的,用于求解包含重叠子问题最优化问题的方法。其基本思想是,将原问题分解为相似的子问题,在求解的过程中通过子问题的解求出原问题的解。动态规划的思想是多种算法的基础,被广泛应用于计算机科学和工程领域。比较著名的应用实例有:求解最短路径问题,背包问题项目管理网络流优化等。

 

 

动态规划在查找有很多重叠子问题的情况的最优解时有效。它将问题重新组合成子问题。为了避免多次解决这些子问题,它们的结果都逐渐被计算并被保存,从简单的问题直到整个问题都被解决。因此,动态规划保存递归时的结果,因而不会在解决同样的问题时花费时间。

动态规划只能应用于有最优子结构的问题。最优子结构的意思是局部最优解能决定全局最优解(对有些问题这个要求并不能完全满足,故有时需要引入一定的近似)。简单地说,问题能够分解成子问题来解决。

 

 

 

步骤

  1. 最优子结构性质。如果问题的最优解所包含的子问题的解也是最优的,我们就称该问题具有最优子结构性质(即满足最优化原理)。最优子结构性质为动态规划算法解决问题提供了重要线索。
  2. 子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。

 

 

简单的说,动态规划就是把问题分解为很多子问题,并且这些都是重叠子问题,通过求解这么子问题来求解原问题的解,在求解子问题的过程中,保存这些中间结果。比如最长公共子序列(Longest Common Subsequence :

 

设有二维数组 f[i][j] 表示Xi 位和Yj 位之前的最长公共子序列的长度,则有:

f[1][1] =same(1,1)
f[i][j] =max{f[i − 1][j − 1] + same(i,j),f[i − 1][j],f[i][j − 1]}

其中,same(a,b)X 的第a 位与Y 的第b 位完全相同时为“1”,否则为“0”。

 

 

 

原创粉丝点击