![](https://img-blog.csdnimg.cn/20190918140158853.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
动态规划
动态规划,个人回顾
qy_zhizi
HUST研究僧-计算机视觉
展开
-
2020-09-15最长公共子序列 与 子串
最长公共子序列class Solution: def longestCommonSubsequence(self, text1: str, text2: str) -> int: n = len(text1) m = len(text2) dp = [[0]*(m+1)for _ in range(n+1)] # print(dp) for i in range(1,n+1): for原创 2020-09-15 17:12:42 · 120 阅读 · 0 评论 -
找零问题 记忆化递归 迭代解法
与背包恰好装满的问题很像,但是本题每种硬币的数量不限制,因此做法很不同,搞了半天,还是看答案搞懂的。就随便记录一下吧背包的容量每次递增一个单位,对于n类的硬币,有n种情况,每种情况都是取一枚硬币,然后求剩余容量的最少硬币数。class Solution: def coinChange(self, coins: List[int], amount: int) -> int: dp = [0]*(amount + 1) inf = float('inf').原创 2020-08-20 23:48:27 · 255 阅读 · 0 评论 -
打家劫舍III 多解法
打家劫舍 IIIdfs+剪枝,后续遍历,单个状态转移一开始想不出什么好的方法,就用了dfs+剪枝的方法,采用后续遍历的方式,每个节点返回这棵子树能获得的最大金额。最大金额分两种情况,当前节点偷和当前节点不偷# Definition for a binary tree node.# class TreeNode:# def __init__(self, x):# self.val = x# self.left = None# sel原创 2020-08-19 23:02:04 · 162 阅读 · 0 评论 -
213. 打家劫舍 II 动态规划 滚动数组
打家劫舍 II二维动态规划dp[i][0] :表示在不选第一个元素的情况下,,当到第i个元素时的最大金额dp[i][1] :表示在选择第一个数的情况下,当到第i个元素时的最大金额初始化状态:dp[0][0] = 0 # 不选第一个元素dp[0][1] = nums[0] # 选第一个元素dp[1][0] = max(dp[0][0], 0 + nums[1]) # 不选, 继承前一个dp[i-1][0]的值, 或者 前两个dp[-1][0] + nums[1] ,dp[-1][0] 可认为为原创 2020-08-17 22:27:34 · 158 阅读 · 1 评论 -
198打家劫舍 动态规划与DFS剪枝
打家劫舍动态规划解法目的是为了求最大金额,状态应该是与最大金额有关的状态转移:由于每个元素都会有两种状态,而且这两种状态和前一个元素的状态有关,因此dp数组是二维的,每个元素也需要记录两种状态dp[i][0]: 表示对第i个元素,不偷的最大金额dp[i][1]: 表示对第i个元素,偷的最大金额# 状态转移 dp[i][0] = max( dp[i-1][0], dp[i-1][1] ) # 无法确定那个大,取最大的dp[i][1] = dp[i-1][0] + nums[i]# 初始原创 2020-08-17 18:18:54 · 274 阅读 · 0 评论 -
leetcode309买卖股票时机与含冷冻期
不含冷冻期,动态规划解法可以不使用动态规划,但是含冷冻期的股票问题就需要了,所以先铺垫一下:这里可以对每一天定义两个状态:dp[i][0]: 表示第i天不持股的最大利益dp[i][1]: 表示第i天持股的最大利益定义状态的记号,方便理解< :表示买入股票,当第i天之前(包括第i天)买入了股票,是持股的状态> :表示卖出股票,当卖出股票时定义为不持股的状态, :表示什么都不做不持股的状态 :<,,,>,,,<,,,>,,, 可以由前一天不持股、前一天持原创 2020-08-15 19:00:40 · 122 阅读 · 0 评论 -
1143. 最长公共子序列
leetcode:1143. 最长公共子序列dp[i][j] 二维数组的动态规划状态转移方程是:需要注意的是,dp数组是(m+1)*(n+1), 第一行和第一列的初始状态是为0的n = len(text1)m = len(text2)(0,0)(0,1)(0,2)...(0,n)(1,0)(1,1)(1,2)......(m,0)t1 = 0if 第i个字符和第j个字符相等: t1 = dp[i-1][j-1] + 1t2 = max(dp[i-1][j], dp[i原创 2020-08-12 18:23:47 · 215 阅读 · 0 评论 -
01背包问题-等分数组的几种解法
dfs 递归+ 集合去重+剪枝类似于背包问题,可以使用动态规划,也可以使用递归法,但不是直接暴力递归,否则复杂度为O(2^n), 通过使用集合去重后,复杂度降到O(n*(sum(nums)/2))class Solution: def canPartition(self, nums: List[int]) -> bool: sum1 = sum(nums) length = len(nums) # print("sum1",sum1)原创 2020-08-11 21:25:51 · 477 阅读 · 0 评论 -
动态规划与贪心-最长上升子序列
动态规划子结构为:在前i个元素中,以第i个元素结尾的最长上升子串的长度,dp[i] .最终要求的就是max(dp[0], dp[i]):前i个元素中,以某个元素结尾的最长上升子串从dp[i-1] 到dp[i] 的推导过程(转移过程): 遍历i之前的元素,nums[j] (0 <= j <= i-1) ; if nums[j] < nums[i] : dp[i] = max(dp[i] , dp[j] + 1)也就是:dp[i]=max(dp[j])+1,其中0≤j<i且num[原创 2020-08-11 21:32:09 · 294 阅读 · 0 评论 -
经典01背包问题 + 状态回溯选择
经典01背包问题 + 状态回溯选择用迭代方式解决01背包问题除了返回背包能装入的最大价值外,可以再用一个二维数组记录每次选择的状态,用这一思路来跟踪每一步所做的选择,并从中回溯出一条最佳路线来。不带选择模式的信息只能获得背包能装入的最大价值N, W = 4,4wt = [4,3,1,1]val = [3000, 2000, 1500, 2000 ]# import sys# nwStr = sys.stdin.readline().strip()# N, W = list(map(int原创 2020-08-11 11:26:11 · 427 阅读 · 0 评论