solution.md 2.0 KB
Newer Older
每日一练社区's avatar
每日一练社区 已提交
1
# 第39级台阶
F
fix bug  
feilong 已提交
2

每日一练社区's avatar
每日一练社区 已提交
3 4 5 6 7 8 9 10 11
小明刚刚看完电影《第39级台阶》,离开电影院的时候,他数了数礼堂前的台阶数,恰好是39级!

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

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

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


每日一练社区's avatar
每日一练社区 已提交
12
以下<span style="color:red">错误</span>的一项是?
每日一练社区's avatar
每日一练社区 已提交
13

每日一练社区's avatar
每日一练社区 已提交
14
## aop
F
fix bug  
feilong 已提交
15

每日一练社区's avatar
每日一练社区 已提交
16
### before
F
fix bug  
feilong 已提交
17

每日一练社区's avatar
每日一练社区 已提交
18
```c
每日一练社区's avatar
每日一练社区 已提交
19
#include <bits/stdc++.h>
每日一练社区's avatar
每日一练社区 已提交
20 21
using namespace std;
```
每日一练社区's avatar
每日一练社区 已提交
22

每日一练社区's avatar
每日一练社区 已提交
23
### after
F
fix bug  
feilong 已提交
24

每日一练社区's avatar
每日一练社区 已提交
25
```c
每日一练社区's avatar
每日一练社区 已提交
26 27 28 29

```

## 答案
F
fix bug  
feilong 已提交
30

每日一练社区's avatar
每日一练社区 已提交
31
```c
每日一练社区's avatar
每日一练社区 已提交
32 33 34 35 36
int ans = 0;
int sum = 0;
vector<int> a(40, 0);

void dfs(int steps)
每日一练社区's avatar
每日一练社区 已提交
37
{
每日一练社区's avatar
每日一练社区 已提交
38
    if (sum >= 39)
每日一练社区's avatar
每日一练社区 已提交
39
    {
每日一练社区's avatar
每日一练社区 已提交
40 41 42
        if ((steps - 1) % 2 == 0 && sum == 39)
            ans++;
        return;
每日一练社区's avatar
每日一练社区 已提交
43
    }
每日一练社区's avatar
每日一练社区 已提交
44 45 46 47 48 49 50 51 52 53 54 55 56 57

    for (int i = 1; i <= 2; i++)
    {
        a[steps] = i;
        sum += i;
        dfs(steps + 1);
        sum -= i;
    }
}

int main()
{
    dfs(0);
    cout << ans << endl;
每日一练社区's avatar
每日一练社区 已提交
58 59 60 61 62
    return 0;
}
```
## 选项

F
fix bug  
feilong 已提交
63

每日一练社区's avatar
每日一练社区 已提交
64
### A
F
fix bug  
feilong 已提交
65

每日一练社区's avatar
每日一练社区 已提交
66
```c
每日一练社区's avatar
每日一练社区 已提交
67 68
int ans = 0;
void dfs(int k, int n)
每日一练社区's avatar
每日一练社区 已提交
69
{
每日一练社区's avatar
每日一练社区 已提交
70
    if (k == 39 && n % 2 == 0)
每日一练社区's avatar
每日一练社区 已提交
71
    {
每日一练社区's avatar
每日一练社区 已提交
72
        ans++;
每日一练社区's avatar
每日一练社区 已提交
73
    }
每日一练社区's avatar
每日一练社区 已提交
74 75 76 77 78 79 80 81 82 83 84
    if (k > 39)
        return;
    dfs(k + 1, n + 1);
    dfs(k + 2, n + 1);
}
int main()
{

    dfs(0, 0);
    printf("%d\n", ans);

每日一练社区's avatar
每日一练社区 已提交
85 86 87 88 89
    return 0;
}
```

### B
F
fix bug  
feilong 已提交
90

每日一练社区's avatar
每日一练社区 已提交
91
```c
每日一练社区's avatar
每日一练社区 已提交
92 93 94
int countt = 0;

void f(int stair, int step)
每日一练社区's avatar
每日一练社区 已提交
95
{
每日一练社区's avatar
每日一练社区 已提交
96 97 98
    if (stair < 0)
        return;
    if (step % 2 == 0 && stair == 0)
每日一练社区's avatar
每日一练社区 已提交
99
    {
每日一练社区's avatar
每日一练社区 已提交
100 101
        countt++;
        return;
每日一练社区's avatar
每日一练社区 已提交
102
    }
每日一练社区's avatar
每日一练社区 已提交
103 104 105 106 107 108 109 110 111 112
    for (int i = 1; i <= 2; i++)
    {
        f(stair - i, step + 1);
    }
}

int main(void)
{
    f(39, 0);
    cout << countt << endl;
每日一练社区's avatar
每日一练社区 已提交
113 114 115 116 117
    return 0;
}
```

### C
F
fix bug  
feilong 已提交
118

每日一练社区's avatar
每日一练社区 已提交
119
```c
每日一练社区's avatar
每日一练社区 已提交
120 121 122 123 124
#define LEFT 0
#define RIGHT 1
using namespace std;
int stage[40][2];

每日一练社区's avatar
每日一练社区 已提交
125 126 127 128 129 130 131 132 133
int main()
{
    int i;
    stage[1][LEFT] = 1;
    stage[1][RIGHT] = 0;
    stage[2][LEFT] = 1;
    stage[2][RIGHT] = 1;
    for (i = 3; i <= 39; i++)
    {
每日一练社区's avatar
每日一练社区 已提交
134 135
        stage[i][LEFT] = stage[i - 1][RIGHT] + stage[i - 2][RIGHT];
        stage[i][RIGHT] = stage[i - 1][LEFT] + stage[i - 2][LEFT];
每日一练社区's avatar
每日一练社区 已提交
136
    }
每日一练社区's avatar
每日一练社区 已提交
137
    cout << stage[39][RIGHT] << endl;
每日一练社区's avatar
每日一练社区 已提交
138 139 140
    return 0;
}
```