蓝桥杯算法提高VIP-超级玛丽


前言

这篇通过例题来讲解一种算法,当然还是先来解题。


一、题目描述

大家都知道" 超级玛丽" 是一个很善于跳跃的探险家,他的拿手好戏是跳跃,但它一次只能向前跳一步或两步。有一次,他要经过一条长为n的羊肠小道,小道中有m个陷阱,这些陷阱都位于整数位置,分别是a1,a2,…am,陷入其中则必死无疑。显然,如果有两个挨着的陷阱,则玛丽是无论如何也跳过不去的。
现在给出小道的长度n,陷阱的个数及位置。求出玛丽从位置1开始,有多少种跳跃方法能到达胜利的彼岸(到达位置n)。

1.输入格式

第一行为两个整数n,m
第二行为m个整数,表示陷阱的位置
数据规模和约定
40> =n> =3,m> =1
n> m;
陷阱不会位于1及n上

2.输出格式

一个整数。表示玛丽跳到n的方案数

二、样例

         样例输入
                 4 1
                 2
         样例输出
                 1

分析样例后直接来看题目解答

三、解题

1.分析

根据上一次的做题(文章),思路直接变化

这个题目是动态规划问题,什么意思呢?就是说玛丽他有两种选择可以是1或者2所以可能情况就较多,最重要的是:前面的情况也会影响着后面的情况,所以就是动态规划。

不过这种题目也有固定的模板就是动态规划方程

dp[i]=dp[i-j]+dp[i]

2.难点

上面的方程先解读一下 i 为玛丽跳跃的位置 而 i-j是上一次跳跃的位置
需要理解的有两点:1,就是我们把前面可能到达这里的情况都统计求和,这样的话每次跳跃后都会记录一次直到跳跃结束。
2,方程的后面又加上了跳跃到本身的情况,原因:会出现到达这个地点的不同中跳跃的方法(这是必然的)但是时间不同。
举个例子:比如我先跳两部这个时候地点为2的这个地方的dp[]就已经不为0了。当你通过1+1到达地点为2的时候时间不在一条线上所以要加上原本就存在的。

3.规范

这里想了想还是说下一 python的多行输入

#想要将输入的数据放置到列表中
list(map(int,input().split()))

a,b = map(int, input().split())

这是两种多行输入的方式

4.代码

n,m=map(int,input().split())
x=list(map(int,input().split()))
#这个是数组的初始化模式
dp=[0 for row in range(n+1)]
dp[1]=1
for i in range (n+1):
#每次只能跳跃1步或者2步
    for j in [1,2]:
    #count()函数是列表中作用为查找的函数
        if i-j>=1 and x.count(i)==0:
          dp[i]=dp[i-j]+dp[i]
print(dp[n])

5.用python的好处

1,写出来的代码简洁(本身的特点)
2,就是动态问题,这个选择跳跃一步还是两步就利用for in [1,2]让电脑来给我们选择


总结

题做多了,遇到类似的就好做
今日文案:公主才不会在意别人的眼光,只会在意自己的裙子有没有脏

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值