```#include<cstdio>
#include<iostream>
#include<vector>
using namespace std;
//简单版本
//vector<int> dp(90);
// int findStairs(int n) { //1.dp[i]表示上到第i层有dp[i]种办法
// dp[1] = 1; //2.初始化从1开始,不从0开始无意义
// dp[2] = 2;
// /*3.第i层的种数由i-1层和i-2层决定从第i-1层只需再迈一个台阶,从
// i-2层只需再迈两个台阶,所以dp[i] = dp[i-1] + dp[i-2]
// */
// for(int i = 3; i <= n; ++i) { //4.确定遍历顺序,从前往后
// dp[i] = dp[i - 1] + dp[i - 2]; //5.举例推导dp数组。dp[3] = 3
// } // dp[4] = 5,dp[5] = 8
// return dp[n]; //时间复杂度O(n) 空间复杂度O(n)
// }
//改进算法
int findStairs(int n) {
int dp[3];
dp[1] = 1;
dp[2] = 2;
int sum = 0;
for (int i = 3; i <= n; ++i) {
sum = dp[1] + dp[2];
dp[1] = dp[2];
dp[2] = sum;
}
return dp[2];
}
//时间复杂度O(n) 空间复杂度O(1)
int main() {
int n;
while(scanf("%d", &n) != EOF) {
if(n <=2)
printf("%d\n", n);
else {
int m = findStairs(n);
printf("%d\n", m);
}
}
}
``` js