递归 VS 动态规划,这里通过数三角形问题来引入递归与动态规划的区别
递归 + 记忆化搜索 —> 动态规划。
分治法与递归实现的动态规划的区别:有没有重复计算。
使用动态规划的几种极可能情况:
1.求最大值和最小值
2.判断是否可行
3.统计方案个数
很大可能不使用动态规划的情况:
1.求出所有具体方案(搜索)
2.输入时一个集合而不是一个序列,也就是交换顺序对结果没有影响
3.暴力已经是多项式级别的
DP擅长的是把暴力 2^n ->n^2 n! ->n^3
动态规划四要素:
1.状态
2.初始化
3.方程
4.答案
一般面试中常见动态规划问题可以分为:
坐标型DP
序列型DP
双序列型DP
划分型DP
背包型DP
区间型DP
接下来分别看一看各个类型的DP
数字三角形
给定一个数字三角形,找到从顶部到底部的最小路径和。每一步可以移动到下面一行的相邻数字上。这里记录n为数字三角形的行数。
方法一:traverse。相当于找出所有的路径,而路径数一共有2^n 条。所以很自然,这种方法超时了。
1 private int best = Integer.MAX_VALUE; 2 /** 3 * @param triangle: a list of lists of integers. 4 * @return: An integer, minimum path sum. 5 */ 6 public int minimumTotal(int[][] triangle) { 7 //traverse 8 if (triangle == null || triangle.length == 0) { 9 return -1; 10 } 11 traverse(triangle, 0, 0, triangle[0][0]); 12 return best; 13 } 14 //从[0,0]走到[x,y]路径只和为sum 15 public void traverse(int[][] triangle, int x, int y, int sum) { 16 if (x == triangle.length - 1) { 17 best = Math.min(best, sum); 18 return; 19 } 20 traverse(triangle, x + 1, y, sum + triangle[x + 1][y]); 21 traverse(triangle, x + 1, y + 1, sum + triangle[x + 1][y + 1]); 22 }