第七章 动态规划

7.1 动态规划

7.1.1 基本思想

把大问题分解为小问题,存在重叠子问题,保存已解决的子问题,避免大量的重复计算,从而得到多项式时间算法

  • 兔子序列
    存在大量重复子问题,使用动态规划只需O(n)
  • 特点
    是以空间换时间的算法,避免重复计算
    从各种可能解选择有可能达到最优解的局部解
    难度大,但是高效,一般用来求最优解
  • 备忘录
    在递归与保存子问题结果结合

7.1.2 基本要素

最优子结构性质
重叠子问题性质
无后效性

7.2 数字三角形

从顶部出发,在每个结点可以选择向左或者向右,一直走到底层,求使路径上的数最大的路径
正推类似迪杰斯特拉 找的是从1到i的最优
倒推好像比较有意思 找的是从i到n的最优

7.3 增加变量

0/1背包

贪心又可能不是最优解
从1-n个物品中选取容量为c的物品,子问题为从1-i个物品中选取容量为w的物品
不是多项式时间算法

  • 恰好装满(修改初始化)
  • 完全背包问题
  • 多重背包问题

7.4 区间动归

关键

一定存在某个断点,使得断开的两段的最值推出整段的最值

矩阵连乘问题

时间复杂度n^3

7.5 DAG图

拓扑排序

找没有入边的顶点,然后删除关联的边,直到所有顶点入队
O(m+n)

嵌套矩形问题

转化为DAG图找最长路径

最长不降子序列

转化为DAG最长路

硬币问题

转化成DAG图问题

7.6 树图动归

最短路问题

负权问题,难以解决,采用动态规划问题
bellman时间复杂度mn 空间复杂度n

负环检测

OPT(n,v)=OPT(n-1,v)则没有负环

SPFA

使用队列的方法 时间复杂度km

Floyd-warshall算法

讲的真烂啊妈的

7.7 序列比对

最长公共子序列

序列z既是x又是y的子序列,则z是x,y的公共子序列
最优子结构性质
空间复杂度n^2

序列比对

时间和空间都是mn
我吐了

你可能感兴趣的:(算法分析与设计)