第39级台阶|2013年蓝桥杯B组题解析第三题-fishers

第39级台阶

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

站在台阶前,他突然又想着一个问题:
如果我每一步只能迈上1个或2个台阶。先迈左脚,然后左右交替,最后一步是迈右脚,也就是说一共要走偶数步。那么,上完39级台阶,有多少种不同的上法呢?
请你利用计算机的优势,帮助小明寻找答案。

答案:51167078

思路:数据很小,可以用递归直接做(每一次都可以走1步、或者走2步),也不用缓存数据。时间复杂度:2^39 O(2^n)

如果数据更大,可以用记忆化递归优化

#include<iostream>
using namespace std;

long ans = 0;
int a[100];

void dfs(int step,int flag,int k){
	if(step == 0 && flag % 2 == 0){
		ans++;
		for(int i=0;i<=k-1;i++){
			cout<<a[i]<<" ";
		}
		cout<<endl;
		return;
	}
	if(step < 0){
		return;
	}
	
	if(step >= 1){
		a[k] = 1;
		dfs(step - 1,!flag,k+1);
		a[k] = 0;
	}
	if(step >=2){
		a[k] = 2;
		dfs(step-2,!flag,k+1);
		a[k] = 0;
	}
}


int main(){
	dfs(39,0,0);
	cout<<ans<<endl;
	return 0;
} 
posted @ 2019-01-27 13:03  fishers  阅读(337)  评论(0编辑  收藏  举报