前言
这篇通过例题来讲解一种算法,当然还是先来解题。
一、题目描述
大家都知道" 超级玛丽" 是一个很善于跳跃的探险家,他的拿手好戏是跳跃,但它一次只能向前跳一步或两步。有一次,他要经过一条长为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]让电脑来给我们选择
总结
题做多了,遇到类似的就好做
今日文案:公主才不会在意别人的眼光,只会在意自己的裙子有没有脏