模板

力扣

https://leetcode.com/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/discuss/108870/Most-consistent-ways-of-dealing-with-the-series-of-stock-problems

力扣

python  版本的解法

LeetCode:188. 买卖股票的最佳时机 IV(python)_wk的博客-CSDN博客

122. 买卖股票的最佳时机 II

贪心

123 买卖股票的最佳时机3

与121买卖股票的最佳时机相同的解法,就是加一个从右边到左边的遍历。
从右边到左边的遍历,记录区间[i,j]之间的最大收益,用最大值-prices[i]。

class Solution(object):def maxProfit(self, prices):""":type prices: List[int]:rtype: int"""#两次,分为左边和右边#左边就是1次收益的最大值那种情况min_price_left=prices[0]res_left=[0]for i in range(1,len(prices)):diff=prices[i]-min_price_leftif prices[i]<min_price_left:min_price_left=prices[i]if diff>res_left[-1]:res_left.append(diff)else:res_left.append(res_left[-1])#从右边到左边max_prices_right=prices[-1]res_right=[0]for i in range(len(prices)-2,-1,-1):diff= max_prices_right - prices[i]if prices[i]>max_prices_right:max_prices_right=prices[i]if diff> res_right[0]:res_right.insert(0,diff)else:res_right.insert(0,res_right[0])res=max(res_left[-1],res_right[0])for i in range(len(prices)-1):if res_left[i]+res_right[i+1]>res:res=res_left[i]+res_right[i+1]return res

188. 买卖股票的最佳时机 IV


#状态转移方程
#共有两个变量,第几天,共交易几次。
#dp[i][k][0]表示第i天,交易k次,当天手里不持有股票
#dp[i][k][1]表示第i天,交易k次,当天手里持有股票,
#最后的结果是dp[i最大值][k最大值][0],最后肯定是股票出手的状态#递推公式
#前一天k次交易,今天无操作,前一天k次交易,今天卖出
#dp[i][k][0]=dp[i-1][k][0],dp[i-1][k][1]+prices[i]
#前一天k次交易,今天无操作,前一天k-1次交易,今天买入。买入操作才会对k加1
#dp[i][k][1]=dp[i-1][k][1],dp[i-1][k-1][0]-prices[i]class Solution:def maxProfit(self, k, prices):if not prices:return 0n = len(prices)max_k = n//2        # 最大交易次数if k >= max_k:      # k>最大交易次数,做 k=无穷大处理res = 0for i in range(n-1):res += max(0, prices[i+1]-prices[i])return reselse:max_k = k# k<最大交易次数,动态规划dp = [[[0]*2 for _ in range(k+1)] for _ in range(n)]#初始化dp[0][0][1]=-float('inf')for i in range(1,max_k+1):dp[0][i][1] = -prices[0]for i in range(1, n):for k in range(1, max_k+1):dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1]+prices[i])dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0]-prices[i])return dp[n-1][max_k][0]k=2
prices=[3,2,6,5,0,3]
n=len(prices)
dp=[[[0]*2 for _ in range(k+1)] for _ in range(n)]
print(dp)
#初始化
dp[0][0][1]=-float('inf')
for i in range(1,k+1):dp[0][i][1] = -prices[0]
for i in range(1,n):for k in range(1,k+1):dp[i][k][0]=max(dp[i-1][k][0],dp[i-1][k][1]+prices[i])dp[i][k][1]=max(dp[i-1][k][1],dp[i-1][k-1][0]-prices[i])
print(dp)
print(dp[n-1][k][0])

动态规划心得

力扣

首先,动态规划问题的一般形式就是求最值。动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说让你求最长递增子序列呀,最小编辑距离呀等等。

既然是要求最值,核心问题是什么呢?求解动态规划的核心问题是穷举。因为要求最值,肯定要把所有可行的答案穷举出来,然后在其中找最值呗。

股票总结

通用思路:

LeetCode:121. 买卖股票的最佳时机(python)_wk的博客-CSDN博客_买卖股票的最佳时机python

第一题和第二题不用套公式,第一题直接遍历,第二题贪心就行了。其他的题目要套一下公式,注意单变量优化,k值过大时候的问题。

注意对比,买卖股票2(无次数限制)和买卖股票(无次数限制,有冷冻期)的差别,主要是一个是在单变量dp的时候,一个记录的是前一天的状态,一个记录的是前2天的状态。

121. 买卖股票的最佳时机

只能一次买入,这个题可以不套用模板做。

122. 买卖股票的最佳时机 II

与第一题不同的是,第二题是无限多次交易。可套用模板,将模板中的k去掉,因为k为无穷大,不受k的影响。

单变量优化。

class Solution:def maxProfit(self, prices):if not prices:return 0 dp_i_0, dp_i_1 = 0, float('-inf') for i in range(len(prices)):temp = dp_i_0dp_i_0 = max(dp_i_0, dp_i_1 + prices[i])dp_i_1 = max(dp_i_1, temp - prices[i])return dp_i_0

不套用模板更简单,贪心法:

class Solution(object):def maxProfit(self, prices):""":type prices: List[int]:rtype: int"""profit = 0for i in range(1, len(prices)):tmp = prices[i] - prices[i - 1]if tmp > 0: profit += tmpreturn profit

123. 买卖股票的最佳时机 III

套公式。

class Solution:def maxProfit(self, prices):if not prices:return 0n = len(prices)# 初始化状态dp = [[[0]*2 for _ in range(3)] for _ in range(n)]for k in range(3):dp[0][k][1] = -prices[0]# 从 i=1 处开始迭代for i in range(1, n):for k in range(1, 3):dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1]+prices[i])dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0]-prices[i])return dp[n-1][2][0]

class Solution(object):def maxProfit(self, prices):if not prices:return 0n = len(prices)def dfs(index,status,k):# 递归终止条件,数组执行到头了,或者交易了两次了if index==n or k==2:return 0# 定义三个变量,分别记录[不动]、[买]、[卖]a,b,c = 0,0,0# 保持不动a = dfs(index+1,status,k)if status:# 递归处理卖的情况,这里需要将k+1,表示执行了一次交易b = dfs(index+1,0,k+1)+prices[index]else:# 递归处理买的情况c = dfs(index+1,1,k)-prices[index]# 最终结果就是三个变量中的最大值return max(a,b,c)return dfs(0,0,0)作者:wang_ni_ma
链接:https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock-iii/solution/wu-chong-shi-xian-xiang-xi-tu-jie-123mai-mai-gu-pi/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

status表示的是当前有没有持有股票。

188. 买卖股票的最佳时机 IV

套公式。

class Solution:def maxProfit(self, k, prices):if not prices:return 0n = len(prices)max_k = n//2        # 最大交易次数if k >= max_k:      # k>最大交易次数,做 k=无穷大处理res = 0for i in range(n-1):res += max(0, prices[i+1]-prices[i])return reselse:max_k = k# k<最大交易次数,动态规划dp = [[[0]*2 for _ in range(k+1)] for _ in range(n)]for i in range(max_k+1):dp[0][i][1] = -prices[0]for i in range(1, n):for k in range(1, max_k+1):dp[i][k][0] = max(dp[i-1][k][0], dp[i-1][k][1]+prices[i])dp[i][k][1] = max(dp[i-1][k][1], dp[i-1][k-1][0]-prices[i])return dp[n-1][max_k][0]

309. 最佳买卖股票时机含冷冻期

套公式。

单变量优化

class Solution:def maxProfit(self, prices):if not prices:return 0# 初始化状态dp_i_0, dp_i_1 = 0, float('-inf')# 初始化前 2 天未持有股票状态的收益dp_pre_0 = 0           # 等同于 i=0 处开始迭代for i in range(len(prices)):# 记录前 1 天状态temp = dp_i_0# 更新当天状态dp_i_0 = max(dp_i_0, dp_i_1+prices[i])dp_i_1 = max(dp_i_1, dp_pre_0-prices[i])# 更新记录的前 1 天状态为前 2 天状态dp_pre_0 = tempreturn dp_i_0

01背包

dd大牛的《背包九讲》 - 知乎

问题描述

状态转移方程

空间优化

空间优化要倒叙遍历,因为,要保证f[v-c[i]]是在i-1状态的,v- c[i]比v小,如果正序遍历,则都是当前i状态的值,

倒叙遍历能保证,更新f[v]的时候,f[v-c[i]]是上一个状态更新的。

完全背包

状态转移方程和空间优化

零钱兑换

零钱兑换1,完全背包问题

dp[v]表示体积为v的时候,results是多少

class Solution(object):def coinChange(self, coins, amount):""":type coins: List[int]:type amount: int:rtype: int"""#前i个物品,放入容量为v的背包的最大价值#前i个物品,放入容量为v的背包,并且把背包塞满,的组合数。#当前状态,等于,上一个状态(i-1)个物品,当前物品不放,则没有数量的加减#如果当前物品放,则有数量的加减#dp[i][j]=min(dp[i-1][j],dp[i-1][j-c[i]]+1),通过状态转移方程,#可看出这是完全背包问题,直接套完全背包的公式。与完全背包不同的是,这个题的初始状态要设置为最大值     dp=[float('inf') for _ in range(amount+1)]dp[0]=0for i in range(len(coins)):for j in range(1,amount+1):if j>=coins[i]:dp[j]=min(dp[j],dp[j-coins[i]]+1)if dp[-1]!=float('inf'):return  dp[-1]return -1

零钱兑换2

也是完全背包问题

class Solution(object):def change(self, amount, coins):""":type amount: int:type coins: List[int]:rtype: int"""dp=[0 for _ in range(amount+1)]dp[0]=1for i in range(len(coins)):for j in range(1,amount+1):if j>=coins[i]:dp[j]=dp[j]+dp[j-coins[i]]return dp[-1]

组合总和

【PHP解法==LeetCode(动态规划4-(背包问题))】416.分割等和子集 && 322.零钱兑换 && 377.组合总和 && 474.一和零 && 139.单词拆分 && 494.目标和_YY-帆S的博客-CSDN博客

零钱兑换2实际上就是组合总和问题,以前组合组合用的是回溯法解决,这次用完全背包法,仔细体会两者复杂度的区别!!

72.编辑距离-字符串的动态规划

class Solution:def minDistance(self, word1, word2):""":type word1: str:type word2: str:rtype: int"""n = len(word1)m = len(word2)# 有一个字符串为空串if n * m == 0:return n + m# DP 数组D = [ [0] * (m + 1) for _ in range(n + 1)]# 边界状态初始化for i in range(n + 1):D[i][0] = ifor j in range(m + 1):D[0][j] = j# 计算所有 DP 值for i in range(1, n + 1):for j in range(1, m + 1):left = D[i - 1][j] + 1down = D[i][j - 1] + 1left_down = D[i - 1][j - 1] if word1[i - 1] != word2[j - 1]:left_down += 1D[i][j] = min(left, down, left_down)return D[n][m]作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/edit-distance/solution/bian-ji-ju-chi-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

887. 鸡蛋掉落

解法1

经典动态规划:高楼扔鸡蛋

暴力递归的方法。

class Solution:def superEggDrop(self, K, N):memo = {}def dp(k, n):if (k, n) not in memo:if n == 0:ans = 0elif k == 1:ans = nelse:lo, hi = 1, n# keep a gap of 2 X values to manually check laterwhile lo + 1 < hi:x = (lo + hi) // 2t1 = dp(k-1, x-1)t2 = dp(k, n-x)if t1 < t2:lo = xelif t1 > t2:hi = xelse:lo = hi = xans = 1 + min(max(dp(k-1, x-1), dp(k, n-x))for x in (lo, hi))memo[k, n] = ans#如果这个k n计算过了,直接返回就行。return memo[k, n]return dp(K, N)

312. 戳气球

经典动态规划:戳气球问题

力扣

打家劫舍

198. 打家劫舍

class Solution:def rob(self, nums: List[int]) -> int:if not nums:return 0size = len(nums)if size == 1:return nums[0]dp = [0] * sizedp[0] = nums[0]dp[1] = max(nums[0], nums[1])for i in range(2, size):dp[i] = max(dp[i - 2] + nums[i], dp[i - 1])return dp[size - 1]作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/house-robber/solution/da-jia-jie-she-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

leetcode-买卖股票/背包问题相关推荐

  1. leetcode买卖股票问题(思路、方法、code)

    一文解决Leetcode买卖股票问题 对于前3个问题,均采用了比较巧妙的解法.由于第4个问题具有非常强的泛型,因此采用了DP,第4个问题的dp如果理解的话,实际上只需要稍加修改状态便可以用该dp思路应 ...

  2. LeetCode买卖股票之一:基本套路(122)

    欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 关于<LeetCode买卖股票>系列 在L ...

  3. LeetCode买卖股票的最佳时机系列总结

    LeetCode买卖股票的最佳时机系列总结 此类动态规划从二维动规理解后优化到一维动规,部分题目还可以用到贪心. 目录: 121 买卖股票的最佳时机1 122 买卖股票的最佳时机2 123 买卖股票的 ...

  4. leetcode 买卖股票问题

    leetcode 买卖股票问题 lc121 买卖股票最佳时机 lc122 买卖股票最佳时机II lc123. 买卖股票的最佳时机 III lc188. 买卖股票的最佳时机 IV lc121 买卖股票最 ...

  5. leetcode 买卖股票系列题目总结

    总结:买卖股票系列题目 1.买卖股票的最佳时机(简单) 121. 买卖股票的最佳时机 难度简单1093 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格. 如果你最多只允许完成一笔交易( ...

  6. LeetCode买卖股票问题集合(六种股票问题)

    一.买卖股票的最佳时机 (LeetCode 121) 简单的动态规划问题,只能完成一次买卖,定义二维 dp[i] [] 数组,dp [i] [0]表示没有股票的状态,dp [i] [1]表示持有股票的 ...

  7. LeetCode 买卖股票的最佳时机 - 超详细讲解系列题

    1.分析 使用通用方法,也即动态规划DP (1)LeetCode 121. 买卖股票的最佳时机 class Solution {public int maxProfit(int[] prices) { ...

  8. LeetCode 买卖股票的最佳时机 6道题1个解法总结

    一个方法解决6道买卖股票题:来自LeetCode题解 一.穷举框架 利用「状态」进行穷举.我们具体到每一天,看看总共有几种可能的「状态」,再找出每个「状态」对应的「选择」.我们要穷举所有「状态」,穷举 ...

  9. [Leetcode] 买卖股票合集(动态规划)

    写完这套题,再搞一台时光机,财务自由不是梦(Doge) ================================== 相关题目链接 121 买卖股票的最佳时机 122 买卖股票的最佳时机 II ...

  10. Leetcode 买卖股票的最佳时机

    买卖股票的最佳时机 题目描述: 给定一个数组 prices ,它的第 i 个元素 prices[i] 表示一支给定股票第 i 天的价格. 你只能选择某一天买入这只股票,并选择在未来的某一个不同的日子卖 ...

最新文章

  1. Visual Studio 2010构建Web浏“.NET研究”览器应用程序
  2. 你的项目应该如何正确分层?
  3. centos中如何找出系统中 load 高时处于运行队列的进程
  4. Shell脚本调试工具set
  5. codeblocks折叠区的颜色
  6. ElasticSearch 聚合查询
  7. javascript学习笔记 - 引用类型 Function
  8. 电脑桌面监控软件都能监控到什么?聊天记录?能防止企业员工泄密吗?
  9. PhpSpreadsheet 生成圆饼图
  10. 在html显示php代码,html跳转php只显示源代码
  11. 计算机画图星星怎么画,教你尺规作图画五角星!
  12. 微信 心理测试 软件,敢不敢做一份微信版心理测试?
  13. 国内主要的量化交易平台
  14. 积极适应大数据时代要求 提升科技化和智能化水平
  15. PHP(4):PHP操作WORD文件
  16. Redis的一些知识
  17. 数据分析task01(2021.06.15)
  18. R语言实战应用精讲50篇(三十)-R语言ggplot2绘制精美高级地图
  19. 2016弱校联盟十一专场10.2——Around the World
  20. 城市信息学其六-信息时代的城市概念化

热门文章

  1. 【文献阅读】YOLT算法实现遥感图像的多尺度目标识别(Adam Van Etten,2018,CVPR)
  2. Java学习笔记之--------注解(Annotation)
  3. stm32使用dsp库,结合Matlab进行FIR滤波器设计
  4. 服务器机柜位置管理,服务器机柜布局怎样才算合理?
  5. 编写函数,接收一个字符串,分别统计大写字母、小写字母、数字、其他字符的个数,并以元组的形式返回结果。
  6. php字符值函数,php从指定ASCII值返回字符函数chr()
  7. Koa2——洋葱模型,简单实现
  8. ORACLE错误一览表,方便大家查询
  9. PI3HDX12211ZHEX DIODES/美台 TQFN42 hdmi视频开关芯片
  10. android 返回按钮 黑色,安卓推送10.0,取消返回键,增设暗黑模式,这些改变你知道吗?...