#include<stdio.h>
#include<string>
//超级楼梯问题
#define MAXSIZE 40
int dp[MAXSIZE+1];
int step1(int m) { //递归方法
if (m <= 3) {
return m - 1;
}
return step1(m - 1) + step1(m - 2);
}
int step2(int m) { //动态规划
dp[1] = 0;
dp[2] = 1;
dp[3] = 2;
for (int i = 4; i <= m; i++) {
dp[i] = dp[i - 1] + dp[i - 2];
}
return dp[m];
}
int step3(int m) { //记忆化递归
if (dp[m] != 0) {
return dp[m];
}
if (m <= 3) {
dp[m] = m - 1;
return dp[m];
}
return step1(m - 1) + step1(m - 2);
}
int step4(int m) { //动态规划空间优化
if (m <= 3) {
return m - 1;
}
int s1 = 1;
int s2 = 2;
int sum = 0;
for (int i = 4; i <= m; i++) {
sum = s1 + s2;
s1 = s2;
s2 = sum;
}
return sum;
}
int main() {
memset(dp, 0, sizeof(dp));
int n = 40;
int s1=step1(n);
printf("%d\n", s1);
int s2 = step2(n);
printf("%d\n", s2);
int s3 = step3(n);
printf("%d\n", s3);
int s4 = step4(n);
printf("%d\n", s4);
return 0;
}