最长递增子序列是很经典的算法题
1. 转化为最长公共子序列问题(LCS)
对原数组进行排序,原数组与排序数组的最长公共子序列长度即为所求。但是存在一个问题:当数组中存在相同元素时,需要单独处理
def lengthOfLIS(nums):
"""
最长子序列
"""
dnums = sorted(nums)
l = len(nums)
dp = [[0]*(l+1) for i in range(l+1)]
for i in range(1, l+1):
for j in range(1, l+1):
if nums[i-1] == dnums[j-1]:
dp[i][j] = dp[i-1][j-1] + 1
else:
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
return max(max(dp))
有相同元素时无法判断最长递增子序列长度
2. 用动态规划
设f(i)表示L中以ai为末元素的最长递增子序列的长