问题:在x轴上,从0到n-1,对应一个一维数组A,要求,每次在位置i只向右跳最多A[i]的长度,问最终能不能到达位置n-1?
代码及注释如下:
#!/usr/bin/python
def get_case(A):
n = len(A)
#创建一个列表
#f[i]表示能不能跳到位置i,1表示能,0表示不能
#先假设全部都跳不到
f = [0]*n
#f[0]表示初始情况
f[0] = 1
for j in range(1,n):
#j是当前步的情况
for i in range(0,j):
#i是上一步的情况
#f[i]==1表示上一步能到达i
#j+A[j]>=i对于当前步来说,上一步在位置i跳的距离A[i]不能超过从位置i到位置j,如果超过就走过位置j的右边去了。
if f[i]==1 and i+A[i]<=j:
#只要找到有一种情况成立即可break,因为是存在性的dp问题,不必找出所有
f[j] = 1
break
return f[n-1]
A = [2,3,1,1,4]
print(get_case(A))
结果:1,能跳到
注意,该问题时间复杂度为O(n2),空间复杂度为O(n)
可以用贪心算法时间复杂度达到O(n)