递归Time Limit Exceeded超时
#include<iostream>
#include<math.h>
#include<string>
using namespace std;
int step(int n)
{
if(n==1) return 1;
if(n==2) return 2;
return step(n-1)+step(n-2);
}
int main()
{
int n,m;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>m;
cout<<step(m-1)<<endl;
}
return 0;
}
设置断点就AC了
#include<iostream>
#include<math.h>
#include<string>
using namespace std;
int step(int n)
{
if(n==1) return 1;
if(n==2) return 2;
if(n==9) return 55;
if(n==19) return 6765;
if(n==29) return 832040;
if(n==34) return 9227465;
return step(n-1)+step(n-2);
}
int main()
{
int n,m;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>m;
cout<<step(m-1)<<endl;
}
return 0;
}
后来找了别人的用循环的
step[1] = 1;
step[2] = 2;
for(int i=3; i<m; i++)
{
step[i] = step[i-1] + step[i-2];
}
比完全递归快在时间复杂度少了一半。
还能少得更多吗,赋值过的是否还需再赋值。
#include<iostream>
#include<math.h>
#include<string>
using namespace std;
static int s[50];
int step(int n)
{
if(n==1) return 1;
if(n==2) return 2;
if(s[n]==0)
s[n]=step(n-1)+step(n-2);
return s[n];
}
int main()
{
int n,m;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>m;
cout<<step(m-1)<<endl;
}
return 0;
}