动态规划知识点总结

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的最优解的代价。

     动态规划知识点总结_第1张图片

     

[3]自底向上填表格: 

   根据状态状态转移方程填表格。箭头方向表示填写方向。

动态规划知识点总结_第2张图片

 

     eg:

 【4】用另一个表格是s【i】【j】记录k值

以一个题为例:

动态规划知识点总结_第3张图片

 有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背包问题

 

 

 

 

 

你可能感兴趣的:(动态规划,算法)