动态规划——最长上升子序列
Posted coding易码当先
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了动态规划——最长上升子序列相关的知识,希望对你有一定的参考价值。
1. 题目描述
▼
给定N个数,求这N个数的最长上升子序列的长度。
2. 问题分析
▼
什么是最长上升子序列?
给出一个样例,如图所示。[2,3,4,7] 和 [2,3,4,6] 就是序列 [2,5,3,4,1,7,6] 的两个最长上升子序列。最长的长度是4.
如何求最长上升子序列?
假设以第 n 个数字结尾的子序列的最长长度用 f(n) 表示,对于第 n 个数字之前的数字我们使用 i 表示,i∈(1,2,⋯,n−1)。如果第 i 个数字小于第 n 个数字,那么 f(n)=max(f(n),f(i)+1),而如果第 i 个数字大于或者等于第 n 个数字,则不能够构成以第 n 个数字结尾的上升子序列。
3. 代码实现
▼
有了上述的递推关系式,我们也可以使用递归实现,也可以使用动态规划实现,出于效率考虑,下面使用动态规划实现,实现代码如下:
def find_max(data, number):
"""
求出一个序列中最长上升子序列的长度。
:param data: 给定的序列
:param number: 给定序列的长度
:return: 最大长度
"""
max_len = [1] * number
for i in range(1, len(data)):
for j in range(0, i):
if data[j] < data[i]:
max_len[i] = max(max_len[i], max_len[j] + 1)
return max(max_len)
以上是关于动态规划——最长上升子序列的主要内容,如果未能解决你的问题,请参考以下文章