回溯使用场景:求出所有可能的解。
List result;
void backtrack(路径,选择列表){
if(满足结束条件){
result.add(路径);
return;
}
for(选择:选择列表){// 遍历集合中的元素
做选择;
backtrack(路径,选择列表);
撤销选择;
}
}
动态规划使用场景:寻求最优解。
#初始化 base case
dp[0][0][...] = base
#进行状态转移
for 状态1 in 状态1的所有取值:
for 状态2 in 状态2的所有取值:
for ...
dp[状态1][状态2][...] = 求最值(选择1,选择2...)
当然动态规划的问题也可以通过回溯算法暴力求解。
动态规划【Dynamic Programming,DP】三要素:通过分析发现题目存在重叠子问题【剪枝优化】
以及最优子结构
则可以确定为动态规划问题。
大概包含以下4个概要:重叠子问题(不具有独立性,互相依赖)
、最优子结构
、状态转移方程
、求最值问题
。
解析思路:明确「状态」、明确「选择」、明确dp函数/数组的定义、明确base case。?
难点: