要是还看不懂为啥是 f[n]=f[n-1]+f[n-2]我就去给三国杀刷好评
题目:
从楼梯第0阶开始网上爬,一次可以爬1阶或者2阶,刚好到达第n阶有多少种爬法
这是动态规划最经典的一题,如果只有1阶,那么就只有1种方法,从0到1,如果是两阶,则有两种方法,1+1或者2
我们把前n阶的和记作f[n],其中f[1]=1,f[2]=2,如果是到达第5阶,首先前4阶的方法肯定都能用,因为到达第4阶只能爬1阶到达5阶,所以f[5]+=f[4],f[5]不可能小于f[4],也可以在f[3]时1步2阶跳到5阶,所以f[5]+=f[3],最后得出f[5]=f[4]+f[3],f[n]=f[n-1]+f[n-2]
public int climbStairs(int n) {
int[] f = new int[n + 1];
f[0] = 1;
f[1] = 1;
if (n < 2) {
return f[n];
} else {
for (int i = 2; i <= n; i++) {
f[i] = f[i - 1] + f[i - 2];
}
}
return f[n];
}
那可能就有人和我一样好奇为啥是这个结果了,比如f[4]只有1中方法跳到5阶,f[3]有两种方法跳到5阶,结果不应该再加1吗?
这个想法把我囚禁了一个下午,理解起来很简单,f[3]虽然有两种方法,其中1种方法是3+1+1=5,而其中的3+1=4已经在f[4]里了,所以也只有一种3+2=5了