YTU 3240,蓝桥杯:第三十九级台阶

                                                   交给时间来处理


3240: 第39级台阶

时间限制: 1 Sec  内存限制: 128 MB
提交: 411  解决: 220
[提交][状态][讨论版][命题人:lyh]

题目描述

小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级! 

站在台阶前,他突然又想着一个问题: 

如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢? 

请你利用计算机的优势,帮助小明寻找答案。

输入

输出

 某个整数

来源

曹令鑫 

[提交][状态]

这个题一上来看错了意思,以为和母牛的故事思路一样。但是,wa了之后才发现,让你走偶数步,走完39级台阶。

扫描二维码关注公众号,回复: 9971036 查看本文章

看懂了之后,还是不会。。。

直接上别人AC的代码了:

递推版

#include<iostream>
using namespace std;
#define LEFT 0
#define RIGHT 1
int f[40][2];
int main()
{
    f[1][LEFT]=1;
    f[1][RIGHT]=0;
    f[2][LEFT]=1;
    f[2][RIGHT]=1;

    for(int i=3;i<=39;i++)
    {
        f[i][LEFT]=f[i-1][RIGHT]+f[i-2][RIGHT];
        f[i][RIGHT]=f[i-1][LEFT]+f[i-2][LEFT];
    }
    cout<<f[39][RIGHT];
    return 0;
}

递归版

#include<iostream>
using namespace std;
int count=0;
void fun(int stair,int step)
{	//stari用于表示剩余的楼梯的层数,当等于0时停止递归
	//step是走过的步数,用来判断是否是偶数,是否符合要求
	 if(stair<0)return; 
	 if(stair==0)	//39节楼梯全部走完 
	 {
	 	if(step%2 == 0)count++;
	 	return;
	 } 
	 fun(stair-1,step+1);	//这一步走了一个台阶 
	 fun(stair-2,step+1);	//这一步走了两个台阶 
}
int main()
{
	fun(39,0);
	cout<<count<<endl;
	return 0; 
}

 比起母牛的故事,递推版就是分成了左右脚呗。。。

但是,那个递归版,为什么没有时间超限呢?(我觉着,这不应该是39层的分枝吗?2^39次方。。。。)(而且,也没有用记忆化存储)(欢迎大佬来指点)

发布了77 篇原创文章 · 获赞 11 · 访问量 5010

猜你喜欢

转载自blog.csdn.net/qq_43346054/article/details/100699590