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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值