题目
运行时间限制: 2sec
内存限制: 1024MB

题目
有一个N段的阶梯。小明现在处于第楼梯的起始处(第0段)。小明有两种选择,往上爬一格,或者往上爬两格。
但是,a1,a2,a3,....,am段的地方坏掉了,脚踏在这些地方是非常危险的。

在不踏入这些坏掉的地方的前提下,到达阶梯的最顶部(第N段),有多少种移动方法?结果需要总数和1,000,000,007取余的结果。

要求

  • 1<=N<=100000
  • 0<=M<=N-1
  • 1<=a1<a2<...<am<=N-1

输入
输入都以以下标准从命令行输入

N M
a1
a2
.
.
.
aM

输出
输出满足条件的总数,与 1,000,000,007取余运算的结果

例1
输入

6 1
3

输出

4

移动方法有下面四种

  • 0→1→2→4→5→6
  • 0→1→2→4→6
  • 0→2→4→5→6
  • 0→2→4→6

例2
输入

10 2
4
5

输出

0

例3
输入

100 5
1
23
45
67
89

输出

608200469

记得最后的结果是总数与1,000,000,007取余


解题思路

读懂题目

1.有一个梯子,上面有些地方坏掉了,不能踩,从最开始的地方,往上踏一步,或者踏两步,看看有多少种爬法可以登顶

看着像是小学或者初中数学竞赛的题目,考察的是数列堆加的用法

global_image_stairs.png

解题思路

和前面两个格子的关系
如上图,到第2个格子的爬格子的方式有两种,
分别是
从0到2
从0到1,从1到2

再细想一想
其实就是
到第0个格子的方式的数量+到第1个格子的方式的数量

如果要求到最顶层第6层的爬格子的数量的话,那么只需要求出
爬到第4个格子的爬格子的方式
爬到第5个格子的爬格子的方式
在做相加就行了

step_stairs.png

那么公式就是steps[i] = steps[i-1] + steps[i-2]

特殊情況

  1. i=0的时候,最开始的位置,必定到达,且到达方法只有1种
  2. i=1的时候,如果第1个阶梯没有坏掉的话,那么到达方法为steps[0]+1
  3. i为坏掉的阶梯的时候,这时候steps[i]= 0

代码

def calculate(n, bindexes):
    arr = []
    for i in range(n):
        if bindexes.get(i):
            arr.append(0)
            continue
 
        if i == 0:
            arr.append(1)
        elif i == 1:
            arr.append(arr[i-1] + 1)
        else:
            arr.append(arr[i-1] + arr[i-2])
    return arr
 
S = input().split(" ")
 
n = int(S[0])
m = int(S[1])
brokenStairIndexes = {}
 
for i in range(m):
    brokenStairIndexes.setdefault(int(input())-1, True)
 
 
arr = calculate(n,brokenStairIndexes)
 
print(arr[n-1] % 1000000007)

伟大不DIAO
1 声望1 粉丝

Done is better than perfect