【发布时间】:2020-11-13 11:44:18
【问题描述】:
Simran 正在以N 的台阶跑上楼梯,并且一次可以跳跃(跳跃)1 步、2 步或 3 步。您必须计算 Simran 可以通过多少种可能的方式跑上楼梯。
输入为N,输出为可能方式的数量。
为什么这段代码不适用于N>21?
#include<bits/stdc++.h>
using namespace std;
long long fact(int n)
{
return (n==0) || (n==1) ? 1 : n* fact(n-1);
}
int main()
{
int n;
cin>>n;
long long count=0;
for(int i=0;i<=n;i++)
{
for(int j=0;j<=n;j++)
{
for(int k=0;k<=n;k++)
{
if((i*1+j*2+k*3)==n)
{
count+=fact(i+j+k)/(fact(i)*fact(j)*fact(k));
}
}
}
}
cout<<count;
return 0;
}
【问题讨论】:
-
您确定要使用 O(n^3) 算法吗?考虑使用 memoization 避免重复计算
-
无关:注意
#include<bits/stdc++.h>和using namespace std;的组合。分开它们都会造成麻烦(explanation 和 more explanation),但它们一起放大彼此的最坏影响并变成your code into a minefield。 -
"#include
using namespace std;" - 不要永远那样做。 -
@Berto99 比 O(n^3) 差很多——
fact不是 O(1)。