前面有n节楼梯,每次可以跨一阶或者两阶,每次可以退后一步。求大神提供思路
本质上和汉诺塔差不多,用堆栈解决
每次可以后退一步是在跨1或2步之后还是同时?
#include
#define N 1000005
using namespace std;
int num[N]; //num[i]=j表示上i阶楼梯,有j种方法。
int main() {
int n;
num[1] = 1;
num[2] = 2;
for(int i = 3; i < N; i++){ //为防止运行超时,每计算一个结果,就保存到数组中,用空间换取时间。
num[i] = num[i - 1] + num[i - 2];
if(num[i] >= 1000000007)
num[i] = num[i] % 1000000007;
}
while(scanf("%d",&n) != EOF){
printf("%d\n",num[n]);
}
return 0;
}
输入样例:
1
2
3
样例输出
1
2
3
public static int getResult2(int n) { int cache[][] = new int[n+1][2]; return getResult(n,cache)[0] + getResult(n,cache)[1]; } public static int[] getResult(int n, int cache [][]) { int result[] = {0,0}; // 1 if(n == 1) { result[0] = 1; result[1] = 0; return result; } if(n == 2) { result[0] = 1; result[1] = 1; return result; } if(n == 3) { result[0] = 2; result[1] = 1; return result; } if(cache[n][0] != 0 || cache[n][1] != 0) { return cache[n]; } // 2 int preResult2[] = getResult(n - 2,cache); int preResult1[] = getResult(n - 1,cache); result[0] = preResult2[0] + preResult2[1] + preResult1[1]; result[1] = preResult2[0]; cache[n][0] = result[0]; cache[n][1] = result[1]; return result; }