Python程序员面试算法宝典---解题总结: 第5章 字符串 5.15 如何求最长递增子序列的长度

# -*- coding: utf-8 -*-

'''
Python程序员面试算法宝典---解题总结: 第5章 字符串 5.15 如何求最长递增子序列的长度

题目:
假设L=是n个不同的实数的序列,L的递增子序列是这样的一个子序列
Lin=,其中k1 L[i]
        { f[i], if L[i+1] <= L[i]
但这样这个公式就错了,它会导致只要后一个元素只要大于前一个元素就被选中,
导致带来刚才分析的问题,即最终选取的是
[3, 5, 6, 9]
而不是
[1, 3, 5, 6, 9]
因为一个元素要么选取,要么不选取。

关键就是需要遍历所有 dp[i]:
                    dp[i] = maxValue
                    maxIndex = j
            else:
                dp[i] = max(1, dp[i])
        # 说明当前是存在递增子序列的
        if maxIndex != -1:
            result[maxIndex] = 1
        if dp[i] > maxLen:
            maxLen = dp[i]
            maxResultIndex = i
    # 还缺少最后一个元素.就是最长递增子序列长度最长的下标
    result[maxResultIndex] = 1
    return maxLen, result


def process():
    array = [3, 1, 3, 8, 5, 6, 9]
    maxLen, result = lis(array)
    print maxLen
    info = ""
    for index, value in enumerate(result):
        if 1 == value:
            if info:
                info += " " + str(array[index])
            else:
                info += str(array[index])
    print info


if __name__ == "__main__":
    process()

 

你可能感兴趣的:(Python程序员面试算法宝典)