小白上楼梯C++(递归+动态规划)

在这里插入图片描述
递归

#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项,很容易出现错误。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值