您的位置:首页 > 其它

HDU 2041 超级楼梯(斐波那契数列)

2018-02-02 08:29 405 查看
题目:

有一楼梯共M级,刚开始时你在第一级,若每次只能跨上一级或二级,要走上第M级,共有多少种走法?

Input:

输入数据首先包含一个整数N,表示测试实例的个数,然后是N行数据,每行包含一个整数M(1<=M<=40),表示楼梯的级数。

Output:

对于每个测试实例,请输出不同走法的数量

Sample Input:

2

2

3

Sample Output:

1

2

题目链接

很明显这是一道斐波那契数列题,最简单的求法就是数列存储循环赋值的写法。

AC代码:

#include <stdio.h>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <cctype>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <cstdlib>

using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;

int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int num[41];
num[0] = 0;
num[1] = 1;
for (int i = 2;i <= 40;++i) {
num[i] = num[i - 1] + num[i - 2];
}
int N;
cin >> N;
while (N--) {
int M;
cin >> M;
cout << num[M] << endl;
}
return 0;
}


递归的入门便是斐波那契数列,但是这道题的斐波那契数列不能用纯递归来写,否则会超时

Time Limit Exceeded代码:

#include <stdio.h>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <cctype>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <cstdlib>

using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;

int Fac(int x) {
if (x == 1 || x == 2) {
return 1;
}
else {
return Fac(x - 1) + Fac(x - 2);
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
int N;
cin >> N;
while (N--) {
int M;
cin >> M;
cout << Fac(M) << endl;
}
return 0;
}


这道题也不是不能用递归解决,递归会超时的原因是计算斐波那契数列时要一层一层往下计算直到递归出口,会造成重复计算浪费时间,我们可以用一个数组存储递归所计算出来的结果,这样下次递归的时候判断一下这个数如果被计算过就可以直接使用。

优化递归AC代码:

#include <stdio.h>
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <iomanip>
#include <cctype>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <cstdlib>

using namespace std;
#define mem(a,b) memset(a,b,sizeof(a))
typedef long long ll;

const int maxn = 42;
int res[maxn];

int Fac(int x) {
if (x <= 1) {
return x;
}
else if (res[x] > 0) {
return res[x];
}
else {
int ans = Fac(x - 1) + Fac(x - 2);
res[x] = ans;
return ans;
}
}

int main() {
ios::sync_with_stdio(0);
cin.tie(0);
mem(res, 0);
res[0] = 1;
res[1] = 1;
int N;
cin >> N;
while (N--) {
int M;
cin >> M;
cout << Fac(M) << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: