动态规划是一种非常强大的算法设计技术,常用于解决优化问题。在LeetCode中,有一个经典的动态规划问题叫做「最长递增子序列(Longest Increasing Subsequence, LIS)」。下面我将通过一个例子来解释如何使用动态规划来解决这个问题。

算法描述

LIS问题可以描述为:给定一个无序数组,找出一个最长的子序列,该子序列的子序列(可以是原始数组中的任意元素)是严格递增的。

代码示例

以下是一个使用Python编写的LIS问题的解决方案:

def lengthOfLIS(nums):
    if not nums:
        return 0
    
    dp = [1] * len(nums)
    for i in range(1, len(nums)):
        for j in range(i):
            if nums[i] > nums[j]:
                dp[i] = max(dp[i], dp[j] + 1)
    return max(dp)

# 测试
nums = [10, 9, 2, 5, 3, 7, 101, 18]
print(lengthOfLIS(nums))  # 输出: 4

动态规划分析

在上面的代码中,dp 数组用于存储以每个元素结尾的最长递增子序列的长度。对于每个元素 nums[i],我们遍历所有 nums[j](其中 j < i),如果 nums[i] 大于 nums[j],则更新 dp[i]

扩展阅读

如果你对动态规划有更多的兴趣,可以阅读我们网站上的「动态规划基础」文章。

[center]https://cloud-image.ullrai.com/q/dynamic_programming/[/center]