1. 程式人生 > >dp基礎座標型問題之最長單調子序列

dp基礎座標型問題之最長單調子序列

問題:最長連續上升子序列長度,或者說最長連續單調子序列

 

程式碼及註釋如下:

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]