题目描述:
You are climbing a stair case. It takes n steps to reach to the top.
Each time you can either climb 1 or 2 steps. In how many distinct ways can you climb to the top?
Note: Given n will be a positive integer.
程序代码:
class Solution {
public:
int climbStairs(int n) {
vector<int> f(n + 1, 0);
if (n == 1)
return 1;
if (n == 2)
return 2;
f[1] = 1;
f[2] = 2;
// f[i] = f[i-1] + f[i- 2]
for (int i = 3; i <= n; i++) {
f[i] = f[i - 1] + f[i - 2];
}
// f[n]为答案
return f[n];
}
};
简要题解:
由于我感觉自己在动态规划方面依旧不是特别熟练,因此本周我打算多做几题动态规划的题目,就从比较简单和基础的本题开始。
本题是比较简单的动态规划问题。根据题意,令f[i]表示第i层楼梯的攀登方法数,则可得出转移方程:
f[i] = f[i - 1] + f[i - 2]
此外,需要列出f[1] = 1, f[2] = 2这两个初始值。这样根据初始值和转移方程,就可以计算得到最后的答案为f[n].
本题很基础,作为本周第1题练手,本周还会再多练习几道动态规划。