超级玛丽
问题描述
⼤家都知道
”
超级玛丽
”
是
⼀
个很善于跳跃的探险家,他的拿⼿好戏是跳跃,但它
⼀
次只能向前跳
⼀
步或两步
。
有
⼀
次,他要经过
⼀
条⻓为n的⽺肠⼩道,⼩道中有m个陷阱,这些陷阱都位于整数位
置,分别是a1,a2,
….am,
陷⼊其中则必死⽆疑。显然,如果有两个挨着的陷阱,则玛丽是⽆论如何也
跳过不去的。
现在给出⼩道的⻓度n,陷阱的个数及位置。求出玛丽从位置1开始,有多少种跳跃⽅法能到达胜
利的彼岸(到达位置n)。
输⼊格式
第
⼀
⾏为两个整数n,m
第⼆⾏为m个整数,表示陷阱的位置
输出格式
⼀
个整数。表示玛丽跳到n的⽅案数
样例输⼊
4 1
2
样例输出
1
数据规模和约定
40>=
n>=
3,m>=
1
n>m;
陷阱不会位于1及n上
分析:和leetcode上⾯那道爬楼梯问题类似,但是要注意的是,爬楼梯是爬n的⻓度,
⽽这⾥是从1出 发到n,只要⾛n-1的⻓度,所以是初始化v[1] =1, v[2]处如果没陷阱就是1,有陷阱就是0,
然后根据 状态转移⽅程v[i] =v[i-1] + v[i-2];求得v[n]的值即为种类个数~~~
#include <iostream>
#include <vector>
using namespace std;
int main() {
int n, m;
cin >> n >> m;
vector<int> v(n+1, -1);
for(int i = 0; i < m; i++) {
int temp;
cin >> temp;
v[temp] = 0;
}
v[1] = 1;
v[2] = v[2] == 0 ? v[2] : 1;
for(int i = 3; i <= n; i++) {
if( v[i] != 0)
v[i] = v[i-1] + v[i-2];
}
cout << v[n];
return 0;
}