关于动态规划和贪婪算法

最近想学点什么,所以就做了,先从动态规划开始吧。

 

下面是搬运的概念:

动态规划 (Dynamic Programic) 是计算机科学领域的一个概念,它是一种特殊的分治思想,利用它可以实现时间复杂度的优化。

Dynamic 动态,即会变化的
Programming 应理解为“表格法”
合起来动态规划就是用一张可变的表格来存储运算结果
——参考《算法导论》

 

顺便理一理和它相关的两种思想——分治和贪心。

定义与适用范围:

分治:
为了解决一个问题,把它分解成若干个与此问题相似的子问题。
这样的“能分解”的性质就叫做最优子结构(又称无后效性)。很多问题都可以满足这个性质。

动态规划:
动态规划是分治的特例。采用分治思想得到的子问题“不一定需要再次求解”,因为之前可能已经计算过相同的子问题了。这样的性质叫做重叠子问题

贪心:
贪心比动态规划更特殊,它还需要问题满足另一个性质——贪心选择性质。每次都可以把原问题分解为一个子问题。

动态规划是一种特殊的分治,而贪心是一种特殊的动态规划。

我给出的是广义的分治和动态规划的定义(这样便于理解),然而实际情况下建议说得精确一点。

复习一下

  • 分治:最优子结构

  • 动规:最优子结构、重叠子问题

  • 贪心:最优子结构、重叠子问题、贪心选择性质

实现思路:

递归形式:改分治。先进行判断。如果这个子问题已经处理过,那就直接把数组里储存了的值输出;否则就“计算结果”,最后储存答案。

递推形式:找出一种可行的拓扑序列,观察一下吧!

详细:

动态规划过程是:每次决策依赖于当前状态,又随即引起状态的转移。一个决策序列就是在变化的状态中产生出来的,所以,这种多阶段最优化决策解决问题的过程就称为动态规划。

 动态规划所处理的问题是一个多阶段决策问题,同时它确定了完成整个过程的一条活动路线(通常是求最优的活动路线)。

    初始状态→│决策1│→│决策2│→…→│决策n│→结束状态

(1)划分阶段:按照问题的时间或空间特征,把问题分为若干个阶段。在划分阶段时,注意划分后的阶段一定要是有序的或者是可排序的,否则问题就无法求解。

(2)确定状态和状态变量:将问题发展到各个阶段时所处于的各种客观情况用不同的状态表示出来。当然,状态的选择要满足无后效性。

 (3)确定决策并写出状态转移方程:因为决策和状态转移有着天然的联系,状态转移就是根据上一阶段的状态和决策来导出本阶段的状态。所以如果确定了决策,状态转移方程也就可写出。但事实上常常是反过来做,根据相邻两个阶段的状态之间的关系来确定决策方法和状态转移方程。

 (4)寻找边界条件:给出的状态转移方程是一个递推式,需要一个递推的终止条件或边界条件。 一般,只要解决问题的阶段、状态和状态转移决策确定了,就可以写出状态转移方程(包括边界条件)。

实际应用中可以按以下几个简化的步骤进行设计:

    (1)分析最优解的性质,并刻画其结构特征。

    (2)递归的定义最优解。

    (3)以自底向上或自顶向下的记忆化方式(备忘录法)计算出最优值

    (4)根据计算最优值时得到的信息,构造问题的最优解

 

以上的要素可以通过一个二维表实现。

参考:

java 动态规划策略原理及例题 - QuinnNorris的博客 - CSDN博客 https://blog.csdn.net/QuinnNorris/article/details/77484573

01背包问题 - FG2006的专栏 - CSDN博客 https://blog.csdn.net/fg2006/article/details/6766384?reload

 

java算法之动态规划基本思想以及具体案例 - 李凯龙 - CSDN博客 https://blog.csdn.net/likailonghaha/article/details/53561646

 

猜你喜欢

转载自blog.csdn.net/Kurapika47/article/details/86129960