怎么开头呢?
一句话概括吧, dp的思想就是递归的反思想。
参考的理化:
https://www.cnblogs.com/steven_oyj/archive/2010/05/22/1741374.html
example:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2
输出: 2解释: 有两种方法可以爬到楼顶。1. 1 阶 + 1 阶2. 2 阶示例 2:输入: 3
输出: 3解释: 有三种方法可以爬到楼顶。1. 1 阶 + 1 阶 + 1 阶2. 1 阶 + 2 阶3. 2 阶 + 1 阶
递归法:
int climbStairs_re(int n) { if (n < 1) return 0; if (2 >= n) return n; return (climbStairs(n - 1) + climbStairs(n - 2));}
dp法:
int climbStairs(int n) { int i = 0; int aiDp[n + 1]; if ((1 == n) || (2 == n)) return n; memset(aiDp, 0, (n + 1) * sizeof(int)); aiDp[1] = 1; aiDp[2] = 2; if (n <= 2) return aiDp[n]; for (i = 3; i <= n; i++) { aiDp[i] = aiDp[i - 1] + aiDp[i - 2]; } return aiDp[n];}
结果比较: