动态规划
“记住你之前做过的事”,如果更准确些,其实是 “记住你之前得到的答案”
- 问题拆解,找到问题之间的具体联系
- 状态定义,及子问题的解/答案
- 递归方程推导/最优子结构,例dp[n]=dp[n-1] + 1
- 实现
贪心算法
大事化小,小事化了。对于一个较大的问题,通过找到与子问题的重叠,把复杂的问题划分为多个小问题。并且对于每个子问题的解进行选择,找出最优值,进行处理,再找出最优值,再处理
- 建立数学模型来描述问题
- 将求解的问题分成若干个小问题
- 对每一个子问题求解,得到局部最优解
- 把每一个问题的局部最优解合并成原来问题的一个解
从某一个问题的初解出发
while(能朝给定目标前进一步)
do
选择当前最优解作为可行解的一个解元素
由所有解元素组合成原来问题的一个解
滑动窗口算法
在给定特定窗口大小的数组或字符串上执行要求的操作。
- 给定一个初始窗口,比如left=right=0
- 不断增加right的值,进行某个操作,使窗口中的值都符合要求
- 停止增加right的值,转而增加left的值,进行某个操作,使窗口中的值都符合要求
- 直到达到数组/字符串的尽头
回溯算法
解决一个回溯问题,实际上就是一个决策树的遍历过程
- 路径,已经做出的选中
- 选中列表,你当前可以做的选择
- 结束条件,到达决策树底层,没办法在做选择的条件
result = []
def backtrack(路径,选择列表):
if 满足结束条件:
result.add(路径);
return
for 选择 in 选择列表:
排除不合法的选择
做选择
backtrack(路径,选择列表)
回溯
模拟算法
根据题目给出的规则对题目要求的相关过程进行编程模拟。