递归 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     }
View Code

相关文章: