题目
假设你正在爬楼梯。需要 n 阶你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
该题有三种解法:递归分治、动态规划(dp)、斐波那契数列法。
动态规划做法:
分析
我们可以通过两部分爬到n阶台阶:
- 通过 n-1阶台阶
- 通过 n-2阶台阶
代码表示也就是:f(n)=f(n-1) + f(n-2)
在动态规划里,这个方程叫做转移方程,用来表示转移状态。
动态规划通常一分为三:
- 初始化
- 转移
- 结束状态
就该题而言:
-
初始化:
f(1)=1; //表示爬到第1阶台阶,有一种方法。
f(2)=2; //表示爬到第2阶台阶,有两种方法。 -
转移:
到第n阶台阶的方法数 = n-1阶台阶的方法数 + n-2阶台阶的方法数。
因为每次你可以爬 1 或 2 个台阶,所以到第n阶时,需要计算n-1和n-2阶台阶的方法数。 -
结束状态:
通常是算法结束的判断。
该题只要计算出n阶的方法数,就算是结束。
代码
int climbStairs(int n) {
int dp[100];
dp[1]=1;
dp[2]=2;
for(int i = 3;i <= n; i++)
{
dp[i]=dp[i-1]+dp[i-2];
}
return dp[n];
}
参考链接:
https://blog.csdn.net/qq_73900397/article/details/134608459