#include<iostream>
#include<map>
using namespace std;
/*
有一座高度是10级台阶的楼梯,从下往上走,每跨一步只能向上1级或者2级台阶。
要求用程序来求出一共有多少种走法。
*/
//递归算法
int getClimbingWays(int n){
if(n < 1){
return 0;
}
if(n == 1){
return 1;
}
if(n == 2){
return 2;
}
return getClimbingWays(n - 1) + getClimbingWays(n - 2);
}
//备忘录算法: 时间和空间复杂度均为O(n)
map<int, int> memo;
int getClimbingWays2(int n){
if(n < 1){
return 0;
}
if(n == 1){
return 1;
}
if(n == 2){
return 2;
}
if(memo.count(n))
return memo[n];
else{
memo[n] = getClimbingWays2(n - 1) + getClimbingWays2(n - 2);
return memo[n];
}
}
//动态规划求解:每一次只保存前两步的结果
//时间复杂度O(n),空间复杂度O(1)
int getClimbingWays3(int n){
if(n < 1)
return 0;
if(n == 1)
return 1;
if(n == 2)
return 2;
int a = 1;
int b = 2;
int temp = 0;
for(int i = 3; i <= n; i ++){
temp = a + b;
a = b;
b = temp;
}
return temp;
}
int main()
{
cout<<"=============递归法============"<<endl;
cout<<getClimbingWays(15)<<endl;
cout<<"=============备忘录算法============"<<endl;
cout<<getClimbingWays2(15)<<endl;
cout<<"=============动态规划============"<<endl;
cout<<getClimbingWays3(15)<<endl;
return 0;
}
简单的动态规划----爬楼梯问题
最新推荐文章于 2025-05-21 20:22:23 发布