dp基礎之存在性dp問題
阿新 • • 發佈:2018-11-19
問題:在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)