动态规划算法初步(1)

动态规划算法初步(1)

动态规划的基本概念:

动态规划(Dynamic Programming 简称DP)。
动态规划是解决“多阶段决策问题”的一种高效算法。
动态规划通过合理组合子问题的解从而解决整个问题解的一种算法。其中的子问题并不是独立的,这些子问题又包含有公共的子子问题。
动态规划算法就是对每个子问题只求一次,并将其结果保存在一张表中(数组),以后再用到时直接从表中拿过来使用,避免重复计算相同的子问题。
动态规划“不做无用功”的求解模式,大大提高了程序的效率。
动态规划算法常用于解决统计类问题(统计方案总数)和最优值问题(最大值或最小值),尤其普遍用于最优化问题。

动态规划的优势:

1.动态规划比穷举具有较少的计算次数
从数塔问题可以看出,层数为k时,
穷举算法求路径的条数2k-1
动态规划计算的次数为:k(k+1)/2
穷举最多计算到n=20,动态规划可以算到n=100
2.递归需要很大的栈空间,而动规的递推法不需要栈空间;使用记忆化搜索比较容易书写程序。

动态规划的术语:

1、 阶段:
把所给求解问题的过程恰当地分成若干个相互联系的阶段,以便于按一定的次序去求解,过程不同,阶段数就可能不同.描述阶段的变量称为阶段变量。在多数情况下,阶段变量是离散的,用k表示。
阶段的划分一般根据时间和空间来划分的。
2、状态:
某一阶段的出发位置成为状态,通常一个阶段有多个状态。 状态通常可以用一个或一组数来描述,称为状态变量。
3、决策:
一个阶段的状态给定以后,从该状态演变到下一阶段某个状态的一种选择(行动)称为决策。描述决策的变量称决策变量。
4、策略和最优策略
所有阶段的决策有序组合构成一个策略。 最优效果的策略叫最优策略。

动态规划问题的特征 :

1、最优子结构
如果问题的一个最优解中包含了子问题的最优解,则该问题具有最优子结构。也称最优化原理。
最优子结构也可以理解为“整体最优则局部最优”。反之不一定成立。
2、重叠子问题
在解决整个问题时,要先解决其子问题,要解决这些子问题,又要先解决他们的子子问题 。而这些子子问题又不是相互独立的,有很多是重复的,这些重复的子子问题称为重叠子问题。
动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只解一次,而后将其解保存在一个表中,以后再遇到这些相同问题时直接查表就可以,而不需要再重复计算,每次查表的时间为常数。
3、无后效性原则
如果一旦确定了定某一阶段的状态,则在这一阶段以后过程的发展不直接受这阶段以前各段状态的影响,下一个阶段的状态只受当前阶段状态的直接影响。
所有各阶段都确定时,整个过程也就确定了。
过程的历史只能通过当前的状态去影响它的未来的发展,这个性质称为无后效性。
无后效性(有向无环图):
无后效性(有向无环图)
有后效性(有环图): a b c ? b c a?
在这里插入图片描述

动态规划的条件:

无后效性、最优子问题(无后效性、最优子问题是否能满足与状态的表示、阶段的划分、状态的转移有关)

设计动态规划法的步骤:

1、找出最优解的性质,并刻画其结构特征; 2、递归地定义最优值(写出动态规划方程); 3、以自底向上的方式计算出最优值:记忆化搜索(树型)、递推
4、根据计算最优值时得到的信息,构造一个最优解。

动态规划的关键:

状态转移方程的构造是动态规划过程中最重要的一步,也是最难的一步.对于大多数的动态规划,寻找状态转移方程有一条十分高效的通道,就是寻找变化中的不变量(已经求得的值)。
定量处理的过程也就是决策实施的过程。

动态规划的一般倒推格式为:

在这里插入图片描述
这里是一种从目标状态往回推的逆序求法,适用于目标状态确定的问题。而很多试题是确定了初始状态的。当然,对于初始状态确定的问题,我们也可以采用从初始状态出发往前推的顺序求法。事实上,这种方法对我们来说要更为直观、更易设计一些,从而更多地出现在我们的解题过程中。
由于动态程序设计方法的模式性比较强,因此应该把主要精力放在状态定义、阶段划分和状态转移方程的设计上。一旦这些问题解决了,事情成功了一大半。

动态规划与贪心算法的不同:

贪心算法采用 “自顶向下”的方式使用最优子结构的:先做选择,在当时看起来是最优的选择(只顾眼前利益),然后再求解选择的那个子问题。
贪心: “先选择,再求解子问题”
动态规划:“先寻找子问题的解,然后做出选择”。

DP常见模型:

动态规划有多种多样的题目,但通常按照状态可分为以下几类:
线性型
坐标型
区间型
背包型
树型

线性模型:

线性动态规划状态是一维的(f[i])。
正推:第i个元素的最优值只与前i-1个元素的最优值有关。
倒推:第i个元素的最优值只第i+1个元素之后的最优值有关。
经典的线性DP题目有最长上升子序列、最大连续子序列和、最长公共子序列等。

坐标模型:

比较简单的一类动态规划问题。
常以二维空间坐标系为模板展开,因此状态转移方程也在坐标系中寻找,
一般定义f[i][j]表示状态,此状态表示某个点的坐标。
有关系的状态:
f[i-1][j], f[i][j-1], f[i-1][j-1]
按行或列求解问题。

区间模型:

区间型动态规划是线性动态规划的拓展,它将区间长度作为阶段,长区间的答案与短区间有关。
在求解长区间答案前需先将短区间答案求出。
区间型动态规划的典型应用有石子合并、乘积最大等。

树型动态规划

树结构上的重要算法(树上搜索);
常用方法是把多叉树转化为二叉树后dp;
“左孩子右兄弟”。

进入例题讲解!
上一章:《深度优先搜索》

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值