蓝桥杯 第39级台阶

网上答案写的都和狗屎一样。看不下去。自己写一个
描述如下
小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!

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

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


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

这明显是一道动态规划问题。 动态规划嘛。我们可以想一想。要走到第n层台阶,那么是不是根据条件可以知道是从n-1层与n-2层走过来的呢?

这道题与台阶的Fib数列区别是,从n-1与n-2走过来的步子,肯定与当前台阶到达的步子是相反的。
我们可以把问题抽象成转换为 第n阶楼梯用右脚到达的次数=n-1阶楼梯左脚到达的次数+n-2阶楼梯左脚到达的次数

上面这个就是转移方程了,因此可以用int [][] dp=new int[n][2];来表示每一层到达的步子与左右脚。
设dp[k][1]为右脚 dp[k][0]为左脚。
首先是边界条件,因为要写出递推式,要先把前两层手工处理了。

所以有
dp[0][1]=0; //右脚到达,不可能,因为先出左脚
dp[0][0]=1;//左脚到达这一层。
dp[1][1]=1;//上一层左脚到达,所以这次变右脚前进一步
dp[1][0]=1;//从开始步用左脚前进两步
//复杂度On,比递归不知道高到哪里去了,还不会stackoverflow
for(int i =2;i<layer;i++) {
//1为右脚
dp[i][1]=dp[i-1][0]+dp[i-2][0];
dp[i][0]=dp[i-1][1]+dp[i-2][1];
}
return dp[layer-1][1];

发布了1 篇原创文章 · 获赞 0 · 访问量 15

猜你喜欢

转载自blog.csdn.net/qq_42499133/article/details/104516840