代碼隨想錄算法訓練營第四十九天| 123.買賣股票的最佳時機III,188.買賣股票的最佳時機IV

目錄

題目鏈接:123.買賣股票的最佳時機III

思路

代碼

題目鏈接:188.買賣股票的最佳時機IV

思路

代碼

總結


題目鏈接:123.買賣股票的最佳時機III

思路

? ? ? ? 與之前買賣股票不同的是本題要求最多買賣兩次,那么dp數組以及遞推公式都有所改變。

? ? ? ? ①dp數組,dp[i][j]表示第i天剩余的最大金幣,j表示操作狀態:

????????????????0表示無操作

? ? ? ? ? ? ? ? 1表示第一次持有股票

? ? ? ? ? ? ? ? 2表示第一次不持有股票

? ? ? ? ? ? ? ? 3表示第二次持有股票

? ? ? ? ? ? ? ? 4表示第二次不持有股票

? ? ? ? ? ? ? ? 五種狀態都是依次連續的:

????????????????????????無操作->第一次持有->第一次不持有->第二次持有->第二次不持有

? ? ? ? ②遞推公式,要包含上述五種狀態的更新

? ? ? ? ? ? ? ? dp[i][0] = dp[i-1][0] 無操作與前一天保持一樣

? ? ? ? ? ? ? ? dp[i][1] = max(dp[i-1][1], dp[i-1][0] - price[i]) 可能之前就買過;如果沒買,說明之前都是無操作的狀態

? ? ? ? ? ? ? ? dp[i][2] = max(dp[i-1][2], dp[i-1][1] + price[i]) 可能之前就賣了;如果沒賣,說明第一次買的還在,今天賣

? ? ? ? ? ? ? ? dp[i][3] = max(dp[i-1][3], dp[i-1][2] - price[i]) 可能進行了一次買賣后,第二次買入了;如果沒買,說明已經進行了第一次的股票買賣,還沒進行第二次

? ? ? ? ? ? ? ? dp[i][4] = max(dp[i-1][4], dp[i-1][3] + price[i]) 可能將第二次買的股票賣了,或者今天賣

? ? ? ? ③dp數組初始化

? ? ? ? ? ? ? ? dp[0][0] = 0 無操作就是0

? ? ? ? ? ? ? ? dp[0][1] = -price[i] 第一天持有,表示第一天買入,減去當天股票價格

? ? ? ? ? ? ? ? dp[0][2] = 0 第一天不持有,表示沒有買入,還是0

? ? ? ? ? ? ? ? dp[0][3] = -price[i] 與第一次情況相同,可以認為第一天買了又賣了,現在是第二次

????????????????dp[0][4] = 0 第二次不持有,表示沒有買入,還是0

? ? ? ? ④遍歷順序,正序遍歷,因為所有的狀態更新都依賴于前一天

? ? ? ? ⑤推導dp數組

代碼

class Solution {
public:// dp數組第一維表示第i天,第二維表示狀態// 0表示無操作// 1表示第一次持有// 2表示第一次不持有// 3表示第二次持有// 4表示第二次不持有int maxProfit(vector<int>& prices) {int len = prices.size();if (len == 1)return 0;vector<vector<int>> dp(len, vector<int>(5, 0));// dp數組初始化dp[0][0] = 0;dp[0][1] = -prices[0];dp[0][2] = 0;dp[0][3] = -prices[0];dp[0][4] = 0;for (int i = 1; i < len; i++) {// 五種狀態的更新dp[i][0] = dp[i - 1][0];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[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);}return dp[len - 1][4];}
};

題目鏈接:188.買賣股票的最佳時機IV

思路

? ? ? ? 原理與123.買賣股票的最佳時機Ⅲ相同,可以買賣k次,創建dp數組時,第二維空間2k+1,初始化以及狀態更新時用for循環。

代碼

class Solution {
public:// dp數組第一維表示第i天// 第二維奇數表示第j次持有,偶數表示第j次不持有,0表示無操作int maxProfit(int k, vector<int>& prices) {int len = prices.size();if (len == 1)return 0;// 每次交易都包含持有和未持有兩種狀態,還有0表示無操作,所以共計2*k+1個狀態int s = 2 * k + 1;vector<vector<int>> dp(len, vector<int>(s, 0));// dp數組初始化,j從到2*kfor (int j = 0; j < s; j++) {if (j % 2 == 1) {dp[0][j] = -prices[0];} else {dp[0][j] = 0;}}// dp數組狀態更新for (int i = 1; i < len; i++) {dp[i][0] = dp[i - 1][0]; // 無操作單獨賦值for (int j = 1; j < s; j++) {// 奇數表示持有,偶數表示未持有// 每種狀態都由前一天推導而來,涉及前一天的當前狀態和前一種狀態if (j % 2 == 1) {dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] - prices[i]);} else {dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1] + prices[i]);}}}return dp[len - 1][2 * k];}
};

總結

? ? ? ? ①買賣股票Ⅰ和Ⅱ分別是只能買賣一次和不限次數的買賣;買賣股票Ⅲ和Ⅳ分別是只能買賣兩次和買賣k次。相同點是當天的狀態只能由昨天推導而來,不同點是狀態的多少

? ? ? ? ②看了買賣股票Ⅲ的題解,AC后,單獨完成了買賣股票Ⅳ,規律性很強

? ? ? ? ③在做這類題時,最重要的是搞清楚dp數組的含義,并且要包含所有的狀態

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/9876.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/9876.shtml
英文地址,請注明出處:http://en.pswp.cn/web/9876.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

攻擊者正在利用AI,對保險公司發起大規模欺詐

保險欺詐一直是保險行業面臨的重要挑戰之一&#xff0c;尤其隨著技術的進步&#xff0c;欺詐者也在不斷更新其手段&#xff0c;利用AI技術&#xff0c;包括生成式模型、機器學習和數據分析工具等欺騙保險公司&#xff0c;而AI技術的應用正成為他們的新工具&#xff0c;使其犯罪…

如何打造個人IP?

打造個人IP&#xff08;Intellectual Property&#xff09;是當今社會中越來越受到關注的話題。個人IP指的是個人在某個領域內所擁有的獨特的、具有商業價值的知識、技能、品牌和影響力。為什么要打造個人IP&#xff1f;如何打造個人IP&#xff1f;下面我將為您詳細解答。 首先…

Navicat連接遠程數據庫時,隔一段時間不操作出現的卡頓問題

使用 Navicat 連接服務器上的數據庫時&#xff0c;如果隔一段時間沒有使用&#xff0c;再次點擊就會出現卡頓的問題。 如&#xff1a;隔一段時間再查詢完數據會出現&#xff1a; 2013 - Lost connection to MySQL server at waiting for initial communication packet, syste…

LinkedList鏈表

LinkedList 的全面說明 LinkList底層實現了雙向鏈表和雙端隊列特點可以添加任意元素&#xff08;元素可以重復&#xff09;&#xff0c;包括null線程不安全&#xff0c;沒有實現同步 LinkedList 的底層操作機制 LinkedList底層維護了一個雙向鏈表LinkList中維護了兩個屬性fi…

【算法入門賽】A.坐標變換(推薦學習)C++題解與代碼

比賽鏈接&#xff1a;https://www.starrycoding.com/contest/8 題目描述 武漢市可以看做一個二維地圖。 牢 e e e掌握了一項特異功能&#xff0c;他可以“瞬移”&#xff0c;每次瞬移需要分別設定 x x x和 y y y的偏移量 d x dx dx和 d y dy dy&#xff0c;瞬移完成后位置會…

【Fastadmin】表格列改input框輸入編輯,以排序權重為例

目錄 1.自定義權重排序,以字段sort為例 js列代碼 在// 初始化表格table.bootstrapTable({ });的后面添加事件 api里面增加formatter方法,如果存在角色權限問題,控制器添

谷歌外鏈怎么發?

既要數量也要質量&#xff0c;要保證你的鏈接廣泛分布&#xff0c;在數量上&#xff0c;確實需要你的鏈接在各種平臺上有所展現&#xff0c;這樣能提升你網站的知名度和曝光率&#xff0c;但是&#xff0c;光有數量是不夠的&#xff0c;如果這些鏈接的內容不行&#xff0c;那對…

ARIMA模型在河流水質預測中的應用_含代碼

#水質模型 #時間序列 #python應用 ARIMA 時間序列模型簡介 時間序列是研究數據隨時間變化而變化的一種算法&#xff0c;是一種預測性分析算法。它的基本出發點就是事物發展都有連續性&#xff0c;按照它本身固有的規律進行。ARIMA(p,d,q)模型全稱為差分自回歸移動平均模型 (A…

SSH文件傳輸

一、設置SSH密鑰對&#xff0c;實現記住密碼 要避免每次使用scp或ssh時都輸入密碼&#xff0c;你可以設置SSH密鑰對&#xff08;一對公鑰和私鑰&#xff09;&#xff0c;并將公鑰添加到遠程服務器上。這樣&#xff0c;你的系統可以通過密鑰自動驗證身份&#xff0c;而無需手動…

Blazor入門-基礎知識+vs2022自帶例程的理解

參考&#xff1a; Blazor 教程 - 生成首個應用 https://dotnet.microsoft.com/zh-cn/learn/aspnet/blazor-tutorial/intro Blazor基礎知識&#xff1a;Visual Studio 2022 中的Blazor開發入門_vs2022 blazor webassembly-CSDN博客 https://blog.csdn.net/mzl87/article/detail…

NSSCTF | [SWPUCTF 2021 新生賽]jicao

打開題目&#xff0c;發現高亮顯示了一個 php 腳本 這是腳本的內容 <?php highlight_file(index.php); include("flag.php"); $id$_POST[id]; $jsonjson_decode($_GET[json],true); if ($id"wllmNB"&&$json[x]"wllm") {echo $flag;…

idea中數據庫的連接(保姆級)

點擊idea中的database 然后再點擊加號 創建 然后選擇第一欄data source 再選擇mysql 然后選擇數據庫的連接方式 再輸入密碼 這里我們本來就是localhost所有就不用改 選擇端口號 然后點擊Test Connection 測試連接 第一次連接會下載連接的文件 我們只需要 等待它下載完成就好了 …

文本批量操作指南:文本合并技巧,批量處理大量文本的方法

在數字化時代&#xff0c;文本處理成為我們日常生活和工作中不可或缺的一部分。無論是整理文檔、數據分析還是內容創作&#xff0c;我們都需要處理大量的文本數據。為了提升工作效率&#xff0c;掌握文本批量操作和合并的技巧變得尤為重要。本文將為您提供一份詳細的文本批量操…

機器學習算法應用——CART決策樹

CART決策樹&#xff08;4-2&#xff09; CART&#xff08;Classification and Regression Trees&#xff09;決策樹是一種常用的機器學習算法&#xff0c;它既可以用于分類問題&#xff0c;也可以用于回歸問題。CART決策樹的主要原理是通過遞歸地將數據集劃分為兩個子集來構建決…

力扣 256. 粉刷房子 LCR 091. 粉刷房子 python AC

動態規劃 class Solution:def minCost(self, costs):row, col len(costs), 3dp [[0] * col for _ in range(row 1)]for i in range(1, row 1):for j in range(col):dp[i][j] costs[i - 1][j - 1]if j 0:dp[i][j] min(dp[i - 1][1], dp[i - 1][2])elif j 1:dp[i][j] m…

【QT教程】QT6硬件高級編程實戰案例 QT硬件高級編程

QT6硬件高級編程實戰案例 使用AI技術輔助生成 QT界面美化視頻課程 QT性能優化視頻課程 QT原理與源碼分析視頻課程 QT QML C擴展開發視頻課程 免費QT視頻課程 您可以看免費1000個QT技術視頻 免費QT視頻課程 QT統計圖和QT數據可視化視頻免費看 免費QT視頻課程 QT性能優化視頻免…

【GoLang基礎】通道(channel)是什么?

問題引出&#xff1a; Go語言中的通道&#xff08;channel&#xff09;是什么&#xff1f; 解答&#xff1a; 通道&#xff08;channel&#xff09;是 Go 語言中用于協程&#xff08;goroutine&#xff09;之間通信和同步的機制。通道提供了一種安全、簡單且高效的方式&#x…

idea運行SpringBoot項目爆紅提示出現:Java HotSpot(TM) 64-Bit Server VM warning...讓我來看看~

在運行SpringBoot項目的時候&#xff0c;發現總有這個警告提示出現&#xff0c;有點強迫癥真的每次運行項目都很難受啊&#xff01;那么今天便來解決這個問題&#xff01; 先來看一下提示內容&#xff1a;Java HotSpot(TM) 64-Bit Server VM warning: Options -Xverify:none an…

FreeRTOS標準庫例程代碼

1.設備STM32F103C8T6 2.工程模板 單片機: 部分單片機的程序例程 - Gitee.comhttps://gitee.com/lovefoolnotme/singlechip/tree/master/STM32_FREERTOS/1.%E5%B7%A5%E7%A8%8B%E6%A8%A1%E6%9D%BF 3.代碼 1-FreeRTOS移植模板 #include "system.h" #include "…

C語言編程中布爾設置位掩碼示例

在C語言編程中&#xff0c;當你想使用整數&#xff08;通常是unsigned int或uint8_t, uint16_t, uint32_t等&#xff09;的位來存儲多個布爾設置時&#xff0c;你會使用位掩碼。每個設置對應于整數中的一個位&#xff0c;你可以通過位操作&#xff08;如按位與&、按位或|、…