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 13
以下哪一项不能得到正确答案?

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

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

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

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

```

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

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

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

    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
每日一练社区 已提交
57 58 59 60 61
    return 0;
}
```
## 选项

F
fix bug  
feilong 已提交
62

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

每日一练社区's avatar
每日一练社区 已提交
65
```cpp
每日一练社区's avatar
每日一练社区 已提交
66 67
int ans = 0;
void dfs(int k, int n)
每日一练社区's avatar
每日一练社区 已提交
68
{
每日一练社区's avatar
每日一练社区 已提交
69
    if (k == 39 && n % 2 == 0)
每日一练社区's avatar
每日一练社区 已提交
70
    {
每日一练社区's avatar
每日一练社区 已提交
71
        ans++;
每日一练社区's avatar
每日一练社区 已提交
72
    }
每日一练社区's avatar
每日一练社区 已提交
73 74 75 76 77 78 79 80 81 82 83
    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
每日一练社区 已提交
84 85 86 87 88
    return 0;
}
```

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

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

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

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

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

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

每日一练社区's avatar
每日一练社区 已提交
124 125 126 127 128 129 130 131 132
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
每日一练社区 已提交
133 134
        stage[i][LEFT] = stage[i - 1][RIGHT] + stage[i - 2][RIGHT];
        stage[i][RIGHT] = stage[i - 1][LEFT] + stage[i - 2][LEFT];
每日一练社区's avatar
每日一练社区 已提交
135
    }
每日一练社区's avatar
每日一练社区 已提交
136
    cout << stage[39][RIGHT] << endl;
每日一练社区's avatar
每日一练社区 已提交
137 138 139
    return 0;
}
```