动态规划问题

动态规划:原问题—>子问题—>原问题,动态规划是一种算法概念,递归往往是实现动态规范的一种方式。

动态规划的一个特点就是当前解可以由上一个阶段的解推出, 由此,把我们要求的问题简化成一个更小的子问题。子问题具有相同的求解方式,只不过是规模小了而已。

注:若不存在子问题模板化适配,递归、分治、动态规划的方式不行,可能就需要穷举的,也就是DFS暴力法。

1.递归(方法重复调自己)迭代(变量动态赋值)思想

a.子问题结构:

  关键找准,递归的对象和关系

  处理后效性,子问题不能影响后续结果

  子问题最优方案导出原问题最优方案

b.子问题重叠情况:

  注意去冗余问题

  缩短时间:记录已经算过的子问题,空间换时间,分析复杂度

 

2.全局搜索遍历,计划搜索(备忘录)

 

3.化繁为简

 

4.常见动态规划问题问法:

最大、最小、最优、计数、最优子结构等离散问题

 

5.解题基本步骤:

设计暴力算法,找到冗余,进行去冗余优化

设计并存储状态一维丶二维丶三维数组丶map等

递归式(递归调用的式子丶状态转移方程)   动态规划递归式可以想想阶乘 n! = n * (n-1)!,当前项和前一项的关系, 0!,1!都为1.

自底向上计算最优解(编程方式)

动态规划:可能需要状态定义、状态存储(数组等)和状态转移式、递归、迭代思想、多种情况时,可能还需要用到max、min。(例子可查看动态规划栏)

 

6.问题:求最大子矩阵和

1)求出每行列方向之和的辅助矩阵,第一行就是原来的第一行,后面每行,就是前面所有行和本行的和。

2)双重循环矩阵每行,用辅助矩阵可以表示出任意行i和其后行j矩阵列方向之和的一个单行数据。从而转换为求最大子段和问题。

3)求每个ij行构建出来的和单行,最大子段和

4)找出所有单行中最大子段和,即是最大矩阵和

 

posted @ 2021-12-08 11:30  对月当歌  阅读(129)  评论(0)    收藏  举报