dp基础之存在性dp问题

问题:在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)

猜你喜欢

转载自blog.csdn.net/lerry13579/article/details/83793226
DP
今日推荐