数楼梯
题目描述
楼梯有 N N N 阶,上楼可以一步上一阶,也可以一步上二阶。
编一个程序,计算共有多少种不同的走法。
输入格式
一个数字,楼梯数。
输出格式
输出走的方式总数。
样例 #1
样例输入 #1
4
样例输出 #1
5
提示
- 对于 60 % 60\% 60% 的数据, N ≤ 50 N \leq 50 N≤50;
- 对于
100
%
100\%
100% 的数据,
1
≤
N
≤
5000
1 \le N \leq 5000
1≤N≤5000。
优化前:90 超时
#include <bits/stdc++.h>
using namespace std;
long long ans[5003][5003];
int len=1;
void jia(int tar)
{
//对每一个数位都进行加操作,时间复杂度必然飙升。所以记录最大长度即可
int k=0;//进位
for(int i=0;i<len;i++)
{
ans[tar][i] = ans[tar-1][i] + ans[tar-2][i] + k;
k = ans[tar][i]/10;
ans[tar][i] %= 10;
}
while(k!=0)
{
ans[tar][len++] = k%10;
k/=10;
}
}
int main()
{
int n;
cin>>n;
ans[1][0] = 1;ans[2][0] = 2;
for(int i=3;i<=n;i++)
{
jia(i);
}
for(int i = len-1;i>=0;i--)cout<<ans[n][i];cout<<endl;
return 0;
}
优化后:100
优化点:并不是对每次数位相加都进行进位运算,而是需要时才运算,同时更新长度,这样就减少了时间
#include <bits/stdc++.h>
using namespace std;
long long ans[5003][5003];
int len=1;
void jia(int tar)
{
//对每一个数位都进行加操作,时间复杂度必然飙升。所以记录最大长度即可
int k=0;//进位
for(int i=0;i<len;i++)
{
ans[tar][i] += ans[tar-1][i] + ans[tar-2][i] ;
if(ans[tar][i]>=10)
{
ans[tar][i+1] += ans[tar][i] / 10;
ans[tar][i] %= 10;
if(ans[tar][len]!=0) len++;
}
}
}
int main()
{
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int n;
cin>>n;
ans[1][0] = 1;ans[2][0] = 2;
for(int i=3;i<=n;i++)
{
jia(i);
}
for(int i = len-1;i>=0;i--)cout<<ans[n][i];cout<<endl;
return 0;
}