1. 程式人生 > >dp基礎之存在性dp問題

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)