dp基礎座標型問題之最長單調子序列
阿新 • • 發佈:2018-11-19
問題:最長連續上升子序列長度,或者說最長連續單調子序列
程式碼及註釋如下:
def get_length(A): #f[i]表示以A[i]結尾的最長上升子序列的長度 n = len(A) #最終結果 res = 0 if n==0: return 0 f = [0 for x in range(n)] for i in range(n): #初始f[0] = 1 f[i] = 1 #子序列長度超過1並且後面的數字大於前面的數字 if i>0 and A[i-1]<A[i]: f[i] = f[i-1]+1 #如果找到比之前的最長長度還大,則更新最長長度 if f[i]>res: res = f[i] return res A = [5,1,6,3,4] print(get_length(A)) #若是單調的話,只需把A反轉後再算一遍,最後取兩者最大值 print(max(get_length(A),get_length(A0))) 結果是2
注:
一:
A=[5,1,6,4,3]
#python列表反轉
#分片
A0 = A[::-1]
#內建函式sorted()
#sorted(iterable[, cmp[, key[, reverse]]])
A1 = sorted(a,reverse=True)
#內建函式reversed
A2 = list(reversed(A))
二:
本問題時間複雜度為O(n),空間複雜度為O(n)
還可以對空間優化達到O(1)
因為再求最大長度時,只有f[i]和f[i-1]