1.动态规划基本思想。
动态规划(Dynamic Programming,DP)是运筹学的一个分支,是求解决策过程最优化的问题
简单的说就是:若要解一个给定问题,我们需要解其不同部分(即子问题),再根据子问题的解以得出原问题的解。
2.动态规划算法的主要特征
【1】求解的是多阶段问题
【2】求解的过程是多步判断,从小到大求解每个子问题,最后求解子问题就是原问题
【3】子问题目标函数的最小值之间存在依赖关系,要求保存子问题的最优解。
3、动态规划的适应情况
1.最优子结构
问题的最优解所包含的子问题的解也是最优的
2.无后效性
无后效性。每个当前状态会且仅会决策出下一状态,而不直接对未来的所有状态负责,可以浅显的理解为——现在决定未来,未来与过去无关。
3.子问题重叠
子问题重叠性质。子问题重叠性质是指在用递归算法自顶向下对问题进行求解时,每次产生的子问题并不总是新问题,有些子问题会被重复计算多次。动态规划算法正是利用了这种子问题的重叠性质,对每一个子问题只计算一次,然后将其计算结果保存在一个表格中,当再次需要计算已经计算过的子问题时,只是在表格中简单地查看一下结果,从而获得较高的效率。
3动态规划解题步骤
【1】刻画最优子结构(证明最优子结构、反证法)
【2】列出状态状态转移方程
【3】画表格,自底向上求解(就是写代码的部分)
【4】构建最优解。(一般用到回溯的方法)
经典案例
矩阵连乘
A=A1*A2*A3*.....An 使得乘法次数最小,其中每个Ai有Pi-1行Pi列。
解题步骤
【1】刻画最优子结构:
将矩阵连乘积AiAi+1……Aj记为A[i,j]。问题就是计算A[1, n]的最优计算次序。
设这个计算次序在矩阵Ak和Ak+1之间将矩阵链断开,这样就将原问题分解为两个子问题:A[i ,k] 和A[k+1,j] 原问题:这两个子问题之和再加上这两个矩阵相乘的计算量。在分别求A[i ,k] 和A[k+1,j] 的最优解。 求出每个子问题的最优解,子问题的最优解相乘便得到原问题的最优解。
【2】状态状态转移方程
m[i,j]为矩阵链Ai...Aj的最优解的代价。
、
[3]自底向上填表格:
根据状态状态转移方程填表格。箭头方向表示填写方向。
eg:
【4】用另一个表格是s【i】【j】记录k值
以一个题为例:
有s[1][6]=3得出在矩阵3加括号(A1A2A3)(A4A5A6)
在有s[1][3]=1得出((A1)A2A3)(A4A5A6) 在s[3+1][6]=5 ((A1)A2A3)((A4A5)A6)
......
0-1背包问题