题目
思路
- 这题看起来像兔子数列,但题目说第一步先迈左脚,最后一步是右脚,说明,走楼梯的次数为偶数
- 模拟dp过程,观察哪些解不满足
/*
1 1
2 (1,1) (2)
3 (1,1,1) (1,2) (2,1)
4 (1,1,1,1) (2,2) (1,2,1) (2,1,1) (1,1,2)
5 (1,1,2,1) (1,2,1,1) (2,1,1,1) (1,1,1,2) (2,2,1) (2,1,2) (1,2,2) (1,1,1,1,1)
*/
- 发现走奇数层台阶满足的次数为原来的二分之一
代码
package 蓝桥杯;
public class 走台阶 {
public static void main(String[] args) {
// dp[i] 表示走到第i阶用的上法
int []dp=new int[50];
dp[1]=1;
dp[2]=2;
/*
1 1
2 (1,1) (2)
3 (1,1,1) (1,2) (2,1)
4 (1,1,1,1) (2,2) (1,2,1) (2,1,1) (1,1,2)
5 (1,1,2,1) (1,2,1,1) (2,1,1,1) (1,1,1,2) (2,2,1) (2,1,2) (1,2,2) (1,1,1,1,1)
*/
for (int i = 3; i <=39; i++) {
dp[i]=dp[i-1]+dp[i-2];
}
System.out.println(dp[39]/2);
}
}
(但我们的分析还是不够严谨的,为什么满足的次数为总次数的一半???下面我们将用递归模拟的形式实现)
递归模拟法
package 蓝桥杯;
import java.util.Arrays;
import java.util.LinkedList;
public class 走台阶递归版 {
static int ans=0;
public static void main(String[] args) {
// 左脚为false,右脚为true
//右脚上去相当于左脚下来
dfs(39,false);
System.out.println(ans);
}
public static void dfs(int x,boolean istrue){
if (x<=0){
return;
}
if ((x==1||x==2)&&istrue==false){
ans++;
}
dfs(x-1,!istrue);
dfs(x-2,!istrue);
}
}
解读:
- 其实1走到39层,和39走到1层的命题是等价的
- 无论先迈哪个脚,只要第一次迈的脚和最后一次迈的脚不同依然满足题意
- 我们模拟两种状态,每次递归的过程中变换脚( !istrue 表示脚的状态变换)
- 当台阶走到只剩下最后1个或2个台阶时,之后就得走下一步了,走下一步之前脚的状态应该和第一步的状态相同,之后再走一次状态改变才能满足题意(递归终止的条件)
当然答案都是相同的