首先贴出一个例题:
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
这道题时leecode70题,是一个简单并且经典的动态规划。
来分析一下这道题,我们每一次上台阶都有两个选择,上一级和上两级台阶,这里很明显我们的决策可以画出一个二叉树,我们每一次决策都与前一次决策有关,而我们的爬楼梯的方法数就应该是这颗二叉树的叶子结点的个数。
我手画了一下这个树,
这里n是4
那么深度优先遍历应该就可以解决这个问题,但是这样我们就会有很多重复的子树,如果我们吧这些子树记录下来,那么就会减少大量的计算次数。这个就是我对dp的简单的理解。
首先把树的第一层和第二层保存,随后分析他们的状态变化规律:
dp[i] = dp[i-1]+dp[i-2];
动态规划代码如下:
public int climbStairs(int n) {
if(n==0) return 0;
if(n==1) return 1;
if(n==2) return 2;
int[] dp = new int[n+1];
dp[0] = 0;
dp[1] = 1;
dp[2] = 2;
for(int i=3;i<=n;i++){
dp[i] += dp[i-1]+dp[i-2];
}
return dp[n];
}