动态规划问题
动态规划:原问题—>子问题—>原问题,动态规划是一种算法概念,递归往往是实现动态规范的一种方式。
动态规划的一个特点就是当前解可以由上一个阶段的解推出, 由此,把我们要求的问题简化成一个更小的子问题。子问题具有相同的求解方式,只不过是规模小了而已。
注:若不存在子问题模板化适配,递归、分治、动态规划的方式不行,可能就需要穷举的,也就是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)找出所有单行中最大子段和,即是最大矩阵和。
浙公网安备 33010602011771号