问题描述:
假设你正在爬楼梯。需要 n 步你才能到达楼顶。
每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例 1:
输入: 2 输出: 2 解释: 有两种方法可以爬到楼顶。 1. 1 步 + 1 步 2. 2 步
示例 2:
输入: 3 输出: 3 解释: 有三种方法可以爬到楼顶。 1. 1 步 + 1 步 + 1 步 2. 1 步 + 2 步 3. 2 步 + 1 步
思路:如果要爬到第i层台阶,因为每次只能爬1层台阶或者2层台阶,所以说只能是从第i-1层台阶或者第i-2层台阶到达第i层,所以到达第i层台阶的方法总数就是到达第i-1层的方法总数加上到达第i-2层的方法总数。这就是为什么爬楼梯问题也是属于动态规划算法的原因,爬第i层楼梯的方法数只计算一次,然后进行保存,以备直接利用进行计算。
int climbStairs(int n) { int a[1000] = { 0 }; a[0] = 0;// a[1] = 1;//爬一层台阶共有1种方法 a[2] = 2;//爬二层台阶共有2种方法,1+1或者直接2 if (n > 1000) return 0; //因为每次只能是1步或者2步,所以怕第i层台阶的方法总数 //就是爬第i-1层台阶的方法数加上爬第i-2层台阶的方法数 for (int i = 3; i <= n; ++i) { a[i] = a[i - 1] + a[i - 2]; } return a[n]; } int main() { int max; max = climbStairs(10); cout << max << endl; system("pause"); return 0; }