蓝桥:超级玛丽

超级玛丽

问题描述

  ⼤家都知道 超级玛丽 个很善于跳跃的探险家,他的拿⼿好戏是跳跃,但它 次只能向前跳 步或两步
次,他要经过 条⻓为n的⽺肠⼩道,⼩道中有m个陷阱,这些陷阱都位于整数位 置,分别是a1,a2, ….am,
陷⼊其中则必死⽆疑。显然,如果有两个挨着的陷阱,则玛丽是⽆论如何也 跳过不去的。
  现在给出⼩道的⻓度n,陷阱的个数及位置。求出玛丽从位置1开始,有多少种跳跃⽅法能到达胜 利的彼岸(到达位置n)。
输⼊格式
  第 ⾏为两个整数n,m
  第⼆⾏为m个整数,表示陷阱的位置
输出格式
  
个整数。表示玛丽跳到n的⽅案数
样例输⼊
4 1
2
样例输出
1
数据规模和约定
  40>= n>= 3,m>= 1
  n>m;
  陷阱不会位于1n
分析:和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; 
}
发布了736 篇原创文章 · 获赞 123 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/S_999999/article/details/103392647
今日推荐