提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
动态规划:一共有10级台阶,一次只能前进一级或两级,有几种上法
递归
#include <iostream>
using namespace std;
int climbStairs(int n) {
if (n == 1 || n == 0) return 1;
else if (n == 2) return 2;
else return climbStairs(n-1) + climbStairs(n-2);
}
int main() {
int n = 10;
int num_ways = climbStairs(n);
cout << "有" << num_ways <<"种上法。" << endl;
return 0;
}
使用动态规划 -> 空间换时间
#include <iostream>
using namespace std;
int climbStairs(int n) {
if (n == 1 || n == 0) return 1;
else if (n == 2) return 2;
int dp[n+1];
dp[0] = 1;
dp[1] = 1;
dp[2] = 2;
for (int i = 3; i <= n; i++) {
dp[i] = dp[i-1] + dp[i-2];
}
return dp[n];
}
int main() {
int n = 10;
int num_ways = climbStairs(n);
cout << "有" << num_ways <<"种上法。" << endl;
return 0;
}
这种方法虽然相对于递归方法更加高效,但是需要额外使用一个数组来存储每一级台阶的上法数量,空间复杂度为 O(n)。如果内存空间非常有限,也可以考虑其他优化方式。