台阶 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;}
阅读全文
0 0
- 台阶 dp 斐波那契
- 走台阶(斐波那契)
- 斐波那契数列-台阶问题
- NYOJ 76 超级台阶 (斐波那契)
- 斐波那契dp
- 走台阶问题运用递推和斐波那契数列C/C++源码实现
- 台阶问题:斐波那契数列的扩展问题研究
- 斐波那契数列衍生之 求青蛙跳上n级台阶的 跳法数(递归)
- 超级台阶(菲波那切数列)
- 斐波那契数列 dp
- 斐波那契数列系列问题,题目描述 一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
- 【斐波那契DP】HDU 4639——HeHe
- 斐波那契,DP,递归,递推,数学归纳
- hdoj 2046 骨牌铺方格 【DP】+【斐波那契】
- hihoCoder1143 DP 斐波那契数列矩阵快速幂
- hihocoder 1164 随机斐波那契 (期望dp)
- 剑指offer-斐波那契数列-DP
- 超级台阶---DP?
- 工作中遇到maven 相关问题
- Two Sum--leetcode
- aar 在Eclipse项目中的使用和sdk开发注意事项
- JavaScript作用域链
- Python3.x和Python2.x的一般区别
- 台阶 dp 斐波那契
- 对象排序2
- EA&UML日拱一卒--活动图::分支和合并
- Java学习第一课
- js正则校验只能以字母和汉字开头的input输入
- Flutter实战一Flutter聊天应用(一)
- C++静态库与动态库
- 获取照片的uri
- SSH项目整合练习中遇到的问题QAQ