动态规划是一种非常强大的算法设计技术,常用于解决优化问题。在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]