台阶 dp 斐波那契

来源:互联网 发布:什么是移动云计算 编辑:程序博客网 时间:2024/06/11 17:08

Description

在玩电脑游戏“Lucky Luke”时,Bom到达了一个场景,Lucky必须爬上一个由n个台阶组成的楼梯。

楼梯从下到上编号为1到n。 Lucky可能会往上爬一步,或者可能一次跳两步。 然而,一些台阶被打破了,Lucky不能站在上面。 一开始,Lucky站在第一阶(第一阶永远不会破)。

突然,Bom想到了一个问题:Lucky爬楼梯到第n阶楼梯有多少种方法?
Bom需要你的帮助来回答这个问题。

Input

第一行由两个整数n和k组成;
n是楼梯的阶数,k是破碎的阶梯个数(0≤k<n≤100000)
第二行由k个整数组成,表示破碎的阶梯的阶数。

Output

输出的结果如题目描述,因为结果可能很大,所以最终输出的结果对14062008取余

Sample Input

4 2
2 3

90000 1
49000

Sample Output

0

4108266

Hint

题意

题解:

列举规律 发现是个斐波那契数列 dp

AC代码

#include <cstdio>#include <set>#include <algorithm>using namespace std;typedef long long ll;#define MOD 14062008int bad[100005];ll dp[100005];int main(){    int n,k;    scanf("%d%d",&n,&k);    int aa;    set<int> qr;    bool flag = false;    if (k!=0){    scanf("%d",&aa);    if (aa == n) flag = true;    bad[aa] = 1;    qr.insert(aa);    }    for (int i = 1; i < k; ++i){        scanf("%d",&aa);        qr.insert(aa);        if (qr.count(aa-1)||aa==n) flag = true;        bad[aa] = 1;    }    dp[1]=1,dp[0]=0;     //i不能从3开始如果台阶2坏了dp不到 而dp[2]初始1 所以初始应从1和0开始     for (int i = 2; i <= n; ++i){        if (!bad[i]){            dp[i] = dp[i-1]%MOD+dp[i-2]%MOD;            dp[i]%=MOD;        }    }if (flag) printf("0\n");    else    printf("%lld\n",dp[n]);    return 0;}
原创粉丝点击