回溯

  1. function fn(n){
  2. // 第一步 判断是否非法
  3. if(input/state is invalid){
  4. return;
  5. }
  6. //第二步 判断递归是否应当结束
  7. if(match condition){
  8. return some value;
  9. }
  10. //遍历所有可能出现的情况
  11. for(all possblie cases){
  12. //第三步 尝试下一步的可能性
  13. solution.push(cases)
  14. //递归
  15. result = fn(m)
  16. //第四步 回溯到上一步
  17. solution.pop(case)
  18. }
  19. }

动态规划

数学优化的方法 也是编程的方法

-> 子问题-> 递归找最优解 -> 组合子问题最优解

最优子结构
状态转移方程
重复子问题

将问题规模减小,推导出状态转移方程