动态规划
定义
动态规划用于解决多阶段决策问题,从一个小规模问题出发,逐步得到大问题的解,并记录中间过程;记录中间过程称为“填表”。
步骤
- 确定动态规划状态
- 写出状态转移方程(画出状态转移表)
- 考虑初始化条件
- 考虑输出状态
- 考虑对空间复杂度的优化
最长连续递增序列
给定一个未经排序的整数数组,找到最长且连续的的递增序列,并返回该序列的长度。
输入: [1,3,5,4,7]
输出: 3
解释: 最长连续递增序列是 [1,3,5], 长度为3。
尽管 [1,3,5,7] 也是升序的子序列, 但它不是连续的,因为5和7在原数组里被4隔开。
def findLengthOfLCIS(self, nums: List[int]) -> int:
n = len(nums) # 列表长度
if not nums or n == 0: # 边界处理
return 0
dp = [1] * n # 建立状态转移表,初始化为1,代表最长连续子序列只有自己一个元素
for i in range(1, n):
if nums[i] > nums[i - 1]: # 满足递增条件
dp[i] = dp[i - 1] + 1 # 状态改变,序列长度+1,else状态为1,元素nums[i]无递增元素 # 返回最大的连续子序列长度
return max(dp)
总结
动态规划实际也是一种暴力算法,因为遍历了所有元素。
动态规划实际上在填一张表[状态转移表],通过规模小的子问题获得规模大的原问题。
可以结合测试用例找出状态转移公式和初始化状态.
动态规划实际也是一种暴力算法,因为遍历了所有元素。
动态规划实际上在填一张表[状态转移表],通过规模小的子问题获得规模大的原问题。
可以结合测试用例找出状态转移公式和初始化状态
参考:https://leetcode-cn.com/problems/longest-palindromic-substring/solution/zhong-xin-kuo-san-dong-tai-gui-hua-by-liweiwei1419/