4. 动态规划

113 阅读1分钟

动态规划组成部分

  • 确定状态:
    • 研究最优策略的最后一步
    • 化成子问题
  • 转移方程
    • 根据子问题定义直接得到
  • 初始条件和边界条件
    • 细心,考虑周全
  • 计算顺序
    • 利用之前的计算结果

消除冗余,加速计算

常见动态规划类型

  • 坐标型动态规划

  • 序列型动态规划

  • 划分型动态规划

  • 区间型动态规划

  • 背包型动态规划

最长序列型动态规划

300.最长递增子序列

dp含义

dp[i]:以nums[i]为结尾的最长递增子序列的长度。

递推公式

dp[i]=max(dp[i],dp[j]+1)

初始化条件

无论几个元素,一定会有nums[i]包含在最长子序列的。

dp[i]=1

遍历顺序

从小到大遍历。

class Solution:
    def lengthOfLIS(self, nums: List[int]) -> int:
        
        n=len(nums)
        if n==0:
            return 0
        dp=list()
        for i in range(n):
            dp.append(1)
            for j in range(i):
                if nums[i]>nums[j]:
                    dp[i]=max(dp[i],dp[j]+1)
        
        return max(dp)