刷题第四十二天 123. 买卖股票的最佳时机Ⅲ 188. 买卖股票的最佳时机Ⅳ

2023-12-13 14:12

本文主要是介绍刷题第四十二天 123. 买卖股票的最佳时机Ⅲ 188. 买卖股票的最佳时机Ⅳ,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

class Solution:def maxProfit(self, prices: List[int]) -> int:# dp[i][0] 第i天第一次持有这只股票的最大现金# dp[i][1] 第i天第一次不持有这只股票的最大现金# dp[i][2] 第i天第二次持有# dp[i][3] 第i天第二次不持有# dp[i][0] = max(dp[i - 1][0], -prices[i])# dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]) # dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] - prices[i])# dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] + prices[i])dp = [[0] * 4 for _ in range(len(prices))]dp[0][0] = -prices[0]dp[0][2] = -prices[0] #默认第一天第一次买入又卖出了for i in range(1,len(prices)):dp[i][0] = max(dp[i - 1][0], -prices[i])dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]) dp[i][2] = max(dp[i - 1][2], dp[i - 1][1] - prices[i])dp[i][3] = max(dp[i - 1][3], dp[i - 1][2] + prices[i])   return dp[-1][3]

和前一题的限制在于只能买卖两次,所以dp数组多定义一个状态,分别表示第一次持有 第一次不持有和第二次持有 第二次不持有,然后进行更新。

注意初始化的时候 第一次持有和第二次持有都需要默认0-prices[0]

class Solution:def maxProfit(self, k: int, prices: List[int]) -> int:# dp[i][k][0] 第i天第k + 1次持有# dp[i][k][1] 第i天第k + 1次不持有# k = 0# dp[i][k][0] = max(dp[i-1][k][0], - prices[i])# dp[i][k][1] = max(dp[i-1][k][1], dp[i - 1][k][0] + prices[i])# k != 0# dp[i][k][0] = max(dp[i-1][k][0], dp[i - 1][k - 1][1] - prices[i])# dp[i][k][1] = max(dp[i-1][k][1], dp[i - 1][k][0] + prices[i])dp = [[[0,0] for _ in range(k)] for _ in range(len(prices))]for i in range(k):dp[0][i][0] = -prices[0]for i in range(1, len(prices)):dp[i][0][0] = max(dp[i-1][0][0], - prices[i])dp[i][0][1] = max(dp[i-1][0][1], dp[i - 1][0][0] + prices[i])        for j in range(1, k):dp[i][j][0] = max(dp[i-1][j][0], dp[i - 1][j - 1][1] - prices[i])dp[i][j][1] = max(dp[i-1][j][1], dp[i - 1][j][0] + prices[i])               return dp[-1][-1][1]

和前一题的差别就是可以多次买卖,所以定义一个三维数组,表示每次持有和不持有

这篇关于刷题第四十二天 123. 买卖股票的最佳时机Ⅲ 188. 买卖股票的最佳时机Ⅳ的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/488763

相关文章

你的华为手机升级了吗? 鸿蒙NEXT多连推5.0.123版本变化颇多

《你的华为手机升级了吗?鸿蒙NEXT多连推5.0.123版本变化颇多》现在的手机系统更新可不仅仅是修修补补那么简单了,华为手机的鸿蒙系统最近可是动作频频,给用户们带来了不少惊喜... 为了让用户的使用体验变得很好,华为手机不仅发布了一系列给力的新机,还在操作系统方面进行了疯狂的发力。尤其是近期,不仅鸿蒙O

【每日刷题】Day113

【每日刷题】Day113 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 91. 解码方法 - 力扣(LeetCode) 2. LCR 098. 不同路径 - 力扣(LeetCode) 3. 63. 不同路径 II - 力扣(LeetCode) 1. 91. 解码方法 - 力扣(LeetCode) //思路:动态规划。 cl

股票数据接口-陈科肇

陈科肇 新浪财经 sz-深圳sh-上海历史分价表:http://market.finance.sina.com.cn/pricehis.php?symbol=sz000506&startdate=2016-12-27&enddate=2016-12-27历史成交明细(当日成交明细):http://vip.stock.finance.sina.com.cn/quotes_service/v

hot100刷题第1-9题,三个专题哈希,双指针,滑动窗口

求满足条件的子数组,一般是前缀和、滑动窗口,经常结合哈希表; 区间操作元素,一般是前缀和、差分数组 数组有序,更大概率会用到二分搜索 目前已经掌握一些基本套路,重零刷起leetcode hot 100, 套路题按套路来,非套路题适当参考gpt解法。 一、梦开始的地方, 两数之和 class Solution:#注意要返回的是数组下标def twoSum(self, nums: Lis

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II

代码随想录刷题day25丨491.递增子序列 ,46.全排列 ,47.全排列 II 1.题目 1.1递增子序列 题目链接:491. 非递减子序列 - 力扣(LeetCode) 视频讲解:回溯算法精讲,树层去重与树枝去重 | LeetCode:491.递增子序列_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0491.%E9%80%92%E

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II

代码随想录刷题day24丨93.复原IP地址 ,78.子集 , 90.子集II 1.题目 1.1复原IP地址 题目链接:93. 复原 IP 地址 - 力扣(LeetCode) 视频讲解:回溯算法如何分割字符串并判断是合法IP?| LeetCode:93.复原IP地址_哔哩哔哩_bilibili 文档讲解:https://programmercarl.com/0093.%E5%A4%8

【笔记】数据结构刷题09

快速排序 215. 数组中的第K个最大元素 class Solution {public:int findKthLargest(vector<int>& nums, int k) {return divide(nums,0,nums.size()-1,nums.size()-k);}int divide(vector<int>& nums,int left,int right,int k)

笔试强训,[NOIP2002普及组]过河卒牛客.游游的水果大礼包牛客.买卖股票的最好时机(二)二叉树非递归前序遍历

目录 [NOIP2002普及组]过河卒 牛客.游游的水果大礼包 牛客.买卖股票的最好时机(二) 二叉树非递归前序遍历 [NOIP2002普及组]过河卒 题里面给的提示很有用,那个马的关系,后面就注意,dp需要作为long的类型。 import java.util.Scanner;// 注意类名必须为 Main, 不要有任何 package xxx 信息publ

C语言:刷题日志(1)

一.阶乘计算升级版 本题要求实现一个打印非负整数阶乘的函数。 其中n是用户传入的参数,其值不超过1000。如果n是非负整数,则该函数必须在一行中打印出n!的值,否则打印“Invalid input”。 首先,知道阶乘是所有小于及等于该数的正整数的积,并且0的阶乘为1。那么我们先来个简单的阶乘计算吧。 #include<stdio.h>int Fact(int n){if (n <=

【每日刷题】Day112

【每日刷题】Day112 🥕个人主页:开敲🍉 🔥所属专栏:每日刷题🍍 🌼文章目录🌼 1. 1137. 第 N 个泰波那契数 - 力扣(LeetCode) 2. 面试题 08.01. 三步问题 - 力扣(LeetCode) 3. LCR 088. 使用最小花费爬楼梯 - 力扣(LeetCode) 1. 1137. 第 N 个泰波那契数 - 力扣(LeetCo