递归
#include<iostream>
using namespace std;
int count=0;
int total;
void f(int current)
{
if(current==total)
count++;
if(current>total)
return;
f(current+1);
f(current+2);
f(current+3);
}
int main()
{
int t;
cin>>total;
f(0);
cout<<count;
return 0;
}
递归简单无脑,但是可能出现栈溢出和速度过慢
动态规划
#include<iostream>
using namespace std;
int current_step[1000]={1,1,2}; //数组 下标表示楼梯层数 值表示种数
int total;//楼梯数
int result;//种数
int main()
{
cin>>total;
for(int i=3;i<=total;i++)
{
//i-1到i一种 i-2到i只有一种 i-3到i只有一种 其实一直不知道如何用动态规划解决,主要是考虑到重复的问题,其实i-1,i-2,i-3到i不重复只要一种,只有最后一种不重复,i-2到i只有一步跨两个台阶不重复,其他都已经重复,i-3到i也是如此
current_step[i]=current_step[i-1]+current_step[i-2]+current_step[i-3];
}
//直接输出
cout<<current_step[total];
return 0;
}
#include<iostream>
using namespace std;
int total;//楼梯数
int result;//种数
int main()
{
cin>>total;
int first=1,second=1,last=2;
for(int i=3;i<=total;i++)
{
int temp=first+second+last;
first=second;
second=last;
last=temp;
}
//直接输出
cout<<last;
return 0;
}
一种用数组,一种用变量,数过大可能内存超了,而且数组不可能一直大,而变量可以解决很高很高的层,另外就是层数过高int溢出
通用模板
#include<iostream>
using namespace std;
int current_step[1000]={1,1,2}; //数组 下标表示楼梯层数 值表示种数
int detail_4[10000];//是否含有4
int total;//楼梯数
int max_step;//最大步数
int result;//种数
int main()
{
cin>>total>>max_step;
for(int i=1;i<max_step;i++)
{
int flag=1;
int p=i;
while(p!=0)
{
if(p%10==4)
{
flag=0;
break;
}
p/=10;
}
if(flag==0)
detail_4[i]=1;
}
for(int i=3;i<=total;i++)
{
for(int j=1;j<=max_step;j++)
{
if(detail_4[j]==0)
{
current_step[i]+=current_step[i-j];
}
}
}
//直接输出
cout<<current_step[total];
return 0;
}
为什么去掉带4的,我也不知道,但是确实是正确答案,而且存在max_step过大,而数组只初始化前3项,很容易出现错误。