动态规划题目特点
1.计数
有多少种方式走到右下角,
有多少种方式选出n个数使得其和为m
2.求最值
利润最大化,最长升序序列
3.存在性(是否)
取石子游戏,选手是否必胜
能不能选出n个数使得其和为m
动态规划一般解题思路:
1.穷举法/暴力搜索法
2.记忆化搜索
3.通过对规律的总结写为迭代形式
动态规划原理:
通过避免重复节点的计算,来加速整个计算过程。
由于用到了字典或哈希表来1保存计算的中间结果,因此也称之为记忆化搜索。
动态规划---以空间换时间。
例题:
找出 nums = [1,3,2,7,6,2] 的最长递增子序列
穷举法/暴力法:
def func(nums,i):
if i == len(nums) - 1: #从数组最后一个元素开始的最长子列数只能是其自身(最后一个元素),即 1
return 1
max_len = 1
for j in range(i+1,len(nums)):
if nums[j] > nums[i]: #后者比前者大,说明这是一个递增数列
max_len = max(max_len,func(nums,j)+1)
return max_len
def length_of_lis(nums):
return max(func(nums,i) for i in range(len(nums)))