**先回顾一下动态规划的基本思想**
第三章。动态规划//<font color=#0099ff size=5 face="黑体"后面加个>为颜色代码
#DC143C为红色
把原问题分解为相对简单的子问题来求解复杂问题
常用于(有重叠问题,最优子结构)
同分治法的区别
动态规划允许问题的性质不同。对每个子问题解一次将结果保留
阶段
状态。状态表示每个阶段开始时面临的状况或客观条件,过程的状态通常可以用一个或一组数描述
过程的每一次实现可以用一个状态序列表示,每阶段的状态是该线路的始点,确定了这些点点序列,线路也就完全确定。
过程的历史只能通过当前状态去影响它的未来的发展,这个性质称为无后效性
决策
最优性定理:作为整个过程的最优策略,它满足相对前面决策所形成的状态而言,余下的子策略必然构成最优子策略(比如最优路径问题)
问题一
最优子结构 当问题的最优解包含了其子问题的解时,称该问题具有最优子结构性质
**算法步骤
1.分析最优值结构,(刻画结构特征?)重点理解这句话
2.递归的定义最优值
3。按自底向上或自顶向下记忆化的方式计算最优(。重点理解记忆化的方式计算最优)**
问题模型一
问题模型一(通过此段代码回答上面几个问题)上面的几个操作到底是什么意思
斐波那契数列
经典递归算法
return fib(n-1)+fib(n-2)//在计算较大的值时因为没有对较小结果进行记录,会对相似子问题进行重复的计算,因此不是一种高效的算法
如何将指数级增长的算法降阶?改进的方法是保存已计算出的子问题
将已经计算出的前n个数保存在数组map中
最短路径问题
向上递推关系式:最短距离等于当前最短距离加上结尾点到其他点中选择出的最短距离点
经典邻接矩阵法处理该问题?思考该问题可以记录一些什么东西降低问题规模?
建立一个数组数组元素标记该点是否已经求出最小距离,如果到达该点时发现该点已经求出最小距离则可以改进算法。
又考虑之前概念中提到的状态与过程
因为状态有n个(按过程来说是n个点按顺序求出最小距离点)
在这里最优解的性质为。在所有点中该点到目的地的距离是最短的,在下一次求最短距离时,另一个点到目标点的最短距离要么是直接到达目标点要么是经过已求出的最短距离点到达目的地
如何递归的定义最优值?
自底至上求出最优值的过程——-一个递归表达式联系该点(该状态如何到达下一个状态)最终状态为所有点均已被标记为求出最短距离(最后一次比较在左右点中谁到达目的地的距离最近便解决了问题)
一些问题关键点
程序利用数组minPath存储每个节点到目的地的最短路径长度,避免重复计算子问题(这里子问题的产生是因为其他点的最短距离没有记录,需要一个n的阶乘的复杂度遍历比较最短距离,因此遇到其他子问题时显然进行了许多次重复运算)
动态规划。 矩阵连乘
问题描述: 对于给定的n个矩阵确定最佳计算次序使得依据此顺序计算矩阵连城需要的数乘次数最少
状态 ?五个括号可以完全确定计算顺序 状态如何增长扩大(怎么向解决问题的方向进行?)子问题处理方法,两个矩阵相乘的标准算法
怎么递归的定义最优值?
最优值m[1,n]
该次数乘最小次数定义为m[i,j]