两道题都可以用递归的思路求解,但会超时
用迭代也可以求解,类似于列出一组数,找规律
2041:【递归求法】【超时】
#include <iostream>
using namespace std;
int WayToLevel(int m){
if(m == 2){
return 1;
}
else if(m == 3){
return 2;
}
else{//递归思路:上第m阶之前可上两阶,那么之前上了m-2阶; 上第m阶之前可上一阶,那么之前上了m-1阶;
//两者的方法数加起来,即概率论中的和事件,完成一件事可由多条并列的方法完成,那么方法总数为各方法数之和
return ( WayToLevel(m-1) ) + ( WayToLevel(m-2) ) ;//其实也就是迭代的a[n-1] + a[n-2]
}
}
int main(){
int n;
int m;
cin >> n;
for(int i = 0; i < n; i++){
cin >> m;
cout << WayToLevel(m) << endl;
}
return 0;
}
#include <iostream>
using namespace std;
int main(){
int x[60];
int n;
int m;
cin >> n;
for(int i = 0; i < n; i++){
cin >> m;
x[1] = 0;//1≤M≤40,1这种情况也要考虑到
x[2] = 1;
x[3] = 2;
for(int j = 4; j <= m; j++){
x[j] = x[j - 1] + x[j - 2];
}
cout << x[m] << endl;
}
return 0;
}
2044 【迭代求法】
#include <iostream>
using namespace std;
int main(){
long long x[60];
int n;
long long a, b;
long long m;
cin >> n;
for(int i = 0; i < n; i++){
cin >> a >> b;
m = b - a;
x[1] = 1;
x[2] = 2;
for(int j = 3; j <= m; j++){
x[j] = x[j - 1] + x[j - 2];
}
cout << x[m] << endl;
}
return 0;
}