1. 动态规划问题解析:从最长递增子序列到最大乘积子数组
动态规划(Dynamic Programming, DP)是算法设计中解决最优化问题的经典方法。今天我想通过两个典型问题——最长递增子序列(LIS)和最大乘积子数组,来深入探讨DP问题的状态定义、转移方程和空间优化技巧。
1.1 最长递增子序列的标准解法
最长递增子序列问题要求找出给定数组中严格递增的子序列的最大长度。比如数组[10,9,2,5,3,7,101,18]的最长递增子序列是[2,3,7,101],长度为4。
标准DP解法如下:
python复制def longest(nums) -> int:
n = len(nums)
dp = [1] * n # 初始化dp数组
for i in range(n):
for j in range(i):
if nums[j] < nums[i]:
dp[i] = max(dp[i], dp[j] + 1)
return max(dp)
这个解法有几个关键点:
- dp[i]表示以nums[i]结尾的最长递增子序列长度
- 初始值为1,因为每个元素本身就是一个长度为1的子序列
- 通过双重循环比较所有前面的元素来更新dp值
注意:这里的内层循环必须遍历i之前的所有元素,因为递增子序列可能来自任意前面的较小元素,这是理解后续空间优化的关键。
1.2 最大乘积子数组的DP解法
最大乘积子数组问题要求找出数组中乘积最大的连续子数组。例如数组[2,3,-2,4]的最大乘积子数组是[2,3],乘积为6。
标准DP解法如下:
python复制class Solution:
def maxProduct(self, nums: List[int]) -> int:
max_prod = min_prod = ans = nums[0]
for i in range(1, len(nums)):
x = nums[i]
temp_max = max_prod
m
