做题笔记===
最长递增子序列(LIS)问题
最长递增子序列(LIS)问题是一个经典的动态规划问题,其目标是找到给定序列中的最长递增子序列的长度。递增子序列是指序列中的元素按照顺序排列,并且每个元素都大于前面的元素。
让我们通过一个具体的例子来说明最长递增子序列(LIS)问题的解法。
假设我们有一个序列:3,4,1,5,7,2,6
我们的目标是找到这个序列的最长递增子序列。
我们首先初始化这个数组为1,1,1,1,1,1,1,因为每个元素本身都可以作为一个长度为1的递增子序列。
然后,我们从第二个元素开始遍历序列,对于每个元素,我们遍历它之前的所有元素,并更新以当前元素结尾的最长递增子序列的长度。具体地说,如果当前元素大于之前的某个元素,并且以该元素结尾的最长递增子序列长度加一大于当前元素结尾的最长递增子序列长度,则更新当前元素结尾的最长递增子序列长度。
最后,我们返回这个数组中的最大值,即为原序列的最长递增子序列的长度。
在这个例子中,最长递增子序列是3,4,5,7,长度为4。
def length_of_lis(nums):
if not nums:
return 0
n = len(nums)
dp = [1] * n # 初始化dp数组,每个数字自身可以作为一个递增子序列
for i in range(1, n):
for j in range(i):
if nums[i] > nums[j]:
dp[i] = max(dp[i], dp[j] + 1) # 更新dp数组,表示以第i个数字结尾的最长递增子序列长度
return max(dp) # 返回dp数组中的最大值,即最长递增子序列的长度
if __name__ == "__main__":
nums = lis

本文介绍了如何使用动态规划方法解决最长递增子序列(LIS)问题,以及其扩展问题——最长公共递增子序列(LICS),通过实例展示了算法实现和优化思路。
最低0.47元/天 解锁文章
3533






