一、动态规划
1、什么是动态规划:
将待解决的问题分为若干个子问题,每个子问题有公共子子问题,递归的解决每个子问题,一步一步求得总问题的答案。—— 动态规划将每个子问题只求解一次,保存在一个表格(数组)里面,而不需要每个子子问题都求解一遍,通过已知解求未知解,直到已知解的问题规模达到题目,避免许多无用工作。
(同分冶法一起理解,分冶法:将问题划分为互不相交的子问题,递归地求解子问题,然后将子问题组合起来就是原问题的解。这样一来,子问题如果有公共子问题,分冶法会做很多无用工作)
2、怎么解决动态规划的问题:
首相定义问题状态(最优解的结构特征),通常是一个动态数组;
然后找到边界;最后找到状态转移方程。
设计状态的思路:由于动态规划是将问题划分为一个个具有相同解结构的子问题,在定义状态时需要注意这一点,将子问题之间的联系定义的简单。因此,状态的定义应该是无后效性问题(已经解决的问题不受后续阶段的影响)。【相对来说的有后效性指,对子问题的描述还有不确定的地方】
经典动态规划问题定义:力扣53,求最大子序和。
建议看看weiwei大神的解析
动态规划写的很好的文章:动态规划
二、回溯
1、什么是回溯:
核心思想就是枚举每一种情况,然后进行比较,最终得到最优解。把问题的解空间转化成了图或者树的结构表示,然后使用深度优先搜索策略进行遍历,遍历的过程中记录和寻找所