动态规划组成部分
- 确定状态:
- 研究最优策略的最后一步
- 化成子问题
- 转移方程
- 根据子问题定义直接得到
- 初始条件和边界条件
- 细心,考虑周全
- 计算顺序
- 利用之前的计算结果
消除冗余,加速计算
常见动态规划类型
-
坐标型动态规划
-
序列型动态规划
-
划分型动态规划
-
区间型动态规划
-
背包型动态规划
最长序列型动态规划
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)