第8章:动态规划——《算法笔记
多阶段决策过程最优
问题由交叠的子问题构成
子问题:一次求解,永久保存
函数幂等
动态规划不但可以作为特殊的空间换时间权衡技术,
也可以经改进避免使用额外的空间
经典自底向上:需要求解所有子问题
试图避免不必要的子问题求解:递归
共同点:递推式
最优化法则:问题最优——子问题最优
反例:最长简单路径
例子:
一排硬币,选不相邻,总金额最大
前 i 枚最大+是否选i+1
问题描述
无限硬币,最少数目找零
总金额为n的最少的硬币数=某个面值d+总金额为(n-d)的最少的硬币数
左上角到右下角爬格子收集硬币
当前位置=max(左一格,上一格)
背包
n个物品,重量wi,价值vi,总承重W,最大化价值
是否包含物品i
记忆化功能:
自顶向下求解,记录已求解子问题
问题分解(递归思想)
问题构造(迭代思想)
问题分解为子问题的第一步:分解出最小可执行子问题
或分解为两个子问题
最优二叉查找树
满足左<父<右
元素查找概率已知
最优=左子树最优+右子树最优+父节点
C(i,j)=min(C(i,k-1)+C(i,k+1))+all(p(i-j))
Warshall:有向图传递闭包
Flody:全部最短路径
有向图传递闭包:两点是否存在路径
深搜广搜得到:路径重复
n阶布尔矩阵
R0——Rn
自身可达——最大长度路径n-1!
不是矩阵乘法
完全最短路径
最短路径:距离矩阵
不包含负回路,包含?
矩阵中任意元素可由直接前驱计算得到
斐波那契
问题转换为斐波那契形式:内存优化
矩阵k:中间节点编号不大于k
适当初始化完成减枝?
习题:
1.
单元格路径:存在不可达点
木条切割:不同长度价格不同
堆分配可以借鉴么
象棋车
对角到对角
最短路径数目
排列组合/动态规划
计算二项式系数
有向无环图最长路径
决定了有前驱依赖任务的最少?时间
币值问题转化
矩阵内寻找最大0子方阵
AB比赛,直到一方n场胜利
A单场胜概率
AB已胜场次
获胜概率
背包:
自顶向下,自底向上
表每行每列
行间列间关系
数量不限
表格:不被求解的问题
直接可用的表格
最长公共子列
最优串?
多边形三角划分
3.
线性时间构造最优二叉树
常量时间
求和公式
构造最优二叉树的动态规划
查找概率的分布
等查找概率
构造不同的二叉查找树
数目
推广到搜索不成功
记忆功能求解最优二叉树
4.
传递闭包
不使用额外存储空间
改写循环,优化部分输入情况
矩阵:行列表
位串列表(位或操作)
有向图无向图
权重为负
.4.8
加强Floyd:同时求出最短路径