题目:300.最长上升子序列

描述:

给定一个无序的整数数组,找到其中最长上升子序列的长度。

示例:

输入: [10,9,2,5,3,7,101,18]

输出: 4

解释: 最长的上升子序列是 [2,3,7,101],它的长度是4。

动态规划 | 最长上升子序列长度_python

一:利用递归实现最长上升子序列

import time
import random

#####      init 300.最长上升子序列  ########
def lts(input):
    result = 0
    for index in range(len(input)):
        result = max(result,f(input,index))

    return result

def f(input,index):
    res = 1
    for j in range(len(input)):

        if j< index and input[j]< input[index]:
            res = max(res, f(input,j)+1)

    return res

#####      init 300.最长上升子序列 :自顶向下(记忆化) ########
def lts_dp(input):
    result = 0
    dp = [-1 for i in range(len(input))]
    for index in range(len(input)):
        result = max(result,f_dp(input,index,dp))

    return result

def f_dp(input,index,dp):
    if dp[index] != -1:
        # print(dp[index])
        return dp[index]

    res = 1
    for j in range(len(input)):

        if j < index and input[j] < input[index]:
            res = max(res, f_dp(input, j,dp) + 1)
    dp[index] = res
    return dp[index]





if __name__ == "__main__":


    input = [random.randint(0,100) for i in range(100)]

    starttime = time.time()
    res = lts_dp(input)
    endtime = time.time()
    seconds = (endtime-starttime)
    print(res,seconds)

    starttime = time.time()
    res = lts(input)
    endtime = time.time()
    seconds = (endtime - starttime)*1000
    print(res, seconds)

两者的时间对比,利用记忆法可以使得整体的效率提升很多,如下打印的时间所示。

19 0.010025739669799805
19 133610.21614074707