今天学习DP的时候忽然将之前困惑了好久的台阶问题想起来了,过去遇到台阶问题只能做到写出递归的程度,但是死活想不到如何简化成公式,突然茅厕顿开,遂记录于此(蹲坑果然是第一生产力(ง •_•)ง)
题目记录如下
- 爬楼梯
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
我们一点一点的分析
首先假设只有一阶楼梯,那就是0-1,这一种爬楼方式
然后假设只有二阶楼梯,那就是0-1-2、0-2,这俩种爬楼方式
再之后假设有三阶楼梯,那就是0-1-2-3、0-2-3、0-1-3这仨种爬楼方式
这时候其实解题思路已经初见倪端了,
0-1-2-3是在0-1-2之后走了一步达到的,
0-2-3是在0-2之后走了一步达到的,
0-1-3是在0-1之后走了两步达到的。
接下来继续,如果是亖阶楼梯,那就是0-1-2-3-4、0-1-2-4、0-1-3-4、0-2-3-4、0-2-4这伍种爬楼方式
①.0-1-2-3-4是在0-1-2-3之后走了一步达到的,
②.0-1-3-4是在0-1-3之后走了一步达到的,
③.0-2-3-4是在0-2-3之后走了一步达到的,
④.0-1-2-4是在0-1-2之后走了两步达到的,
⑤.0-2-4是在0-2之后走了两步达到的。
其中,①②③是由走到第三节台阶的走法演变出来的
④⑤是由走到第亖节台阶的走法演变出来的
所以由此推导,有伍阶楼梯,应该就是3+5 = 8种。
公式就是f(n) = f(n-1)+f(n-2)
其中,f(1) = 1、f(2) = 2
递归就不写了,网上一大把,想抄代码请另寻他处|_•`)
说笑了,我这种火雷分怎么可能不把代码放出来
public int climbStairs(int n) {
int ans = 1;
int t1 = 1;
int t2 = 1;
for (int i = 2; i <= n; i++) {
ans = t1+t2;
t1 = t2;
t2 = ans;
}
return ans;
}
搞定收工─=≡Σ(((つ•̀ω•́)つ