题目描述:原题链接
一只袋鼠要从河这边跳到河对岸,河很宽,但是河中间打了很多桩子,每隔一米就有一个,每个桩子上都有一个弹簧,袋鼠跳到弹簧上就可以跳的更远。每个弹簧力量不同,用一个数字代表它的力量,如果弹簧力量为5,就代表袋鼠下一跳最多能够跳5米,如果为0,就会陷进去无法继续跳跃。河流一共N米宽,袋鼠初始位置就在第一个弹簧上面,要跳到最后一个弹簧之后就算过河了,给定每个弹簧的力量,求袋鼠最少需要多少跳能够到达对岸。如果无法到达输出-1
基本思路:
从起始位置出发,每到一个位置,根据它的弹簧能力,e.g. space 来遍历下一步可能到达的所有位置,并判断当前跳跃方式是否为到达该位置的最短路径,类似为维特比译码。
源代码@Python
1 N = input() 2 x = map(int, raw_input().split()) 3 4 step = [float("Inf") for i in range(0,N+1)]# to record step before this 5 step[0] = 0 #the initial pos 6 7 for i in range(0,N): 8 # if x[i]==0: 9 # continue 10 for iSpace in range(1,x[i]+1): 11 if i+iSpace<=N: 12 step[i+iSpace] = min(1+step[i],step[i+iSpace]) 13 if step[N]==float("Inf"): 14 print str(-1) 15 else: 16 print str(step[N])
注:
- stepy用于存储到达每个位置所需的最小步数。这里初始化为无穷大,便于每次比较取最小值,但输出时需要加判断;也可以初始化为-1,这样每次更新时需要判断是否第一次到达该位置。
- step的长度比弹簧个数多一个,最后一个表示目的地(河对岸)。这样,如果能到达,直接输出目的地对应的step数,且同时避免了不是从最后一个弹簧跳到河对岸的情况;
- 可加判断【line 8-9】跳过无跳跃能力的弹簧