leetcode 309. Best Time to Buy and Sell Stock with Cooldown

目錄

題目描述

第一步,明確并理解dp數組及下標的含義

第二步,分析并理解遞推公式

1.求dp[i][0]

2.求dp[i][1]

3.求dp[i][2]

第三步,理解dp數組如何初始化

第四步,理解遍歷順序

代碼


題目描述

這道題與第122題的區別就是賣出股票后的一天不能買股票。仍然用動態規劃解決。這類題目的關鍵是要分析每一天有幾種狀態,用dp數組變量記錄這些狀態。?

第一步,明確并理解dp數組及下標的含義

//dp[i][0]表示從第0天開始一直到第i天結束時,處于持有股票的狀態,此時的最大利潤

//dp[i][1]表示從第0天開始一直到第i天結束時,由于第i天賣出股票此時處于不持有股票的狀態,此時的最大利潤

//dp[i][2]表示從第0天開始一直到第i天結束時,由于第i天之前賣出股票并且第i天沒有賣出股票此時處于不持有股票的狀態,此時的最大利潤

        int n = prices.size();//dp[i][0]表示從第0天開始一直到第i天結束時,處于持有股票的狀態,此時的最大利潤//dp[i][1]表示從第0天開始一直到第i天結束時,由于第i天賣出股票此時處于不持有股票的狀態,此時的最大利潤//dp[i][2]表示從第0天開始一直到第i天結束時,由于第i天之前賣出股票并且第i天沒有賣出股票此時處于不持有股票的狀態,此時的最大利潤vector<vector<int>> dp(n,vector<int>(3,0));

第二步,分析并理解遞推公式

1.求dp[i][0]

//第i天結束時處于持有股票的狀態,有兩種可能的原因:

//一是前一天(第i-1天)結束時就已經處于持有股票的狀態(對應狀態dp[i-1][0]),第i天什么也不做。

//二是第i天買入了股票(需支付prices[i]),第i天能買入股票的前提是第i-1天結束時就已經處于不持有股票的狀態(并且第i-1天沒有賣出股票)(對應狀態dp[i-1][2])。

dp[i][0] = max(dp[i-1][0],dp[i-1][2] - prices[i]);

2.求dp[i][1]

//第i天結束時處于不持有股票的狀態并且是因為第i天賣出了股票,第i天能賣出股票的前提是第i-1天結束時處于持有股票的狀態(對應dp[i-1][0])

dp[i][1] = dp[i-1][0] + prices[i];

3.求dp[i][2]

//第i天結束時處于不持有股票的狀態并且第i天沒有賣出股票,有兩種可能的原因:

//一是前一天(第i-1天)賣出了股票導致第i-1天結束時處于不持有股票的狀態(對應狀態dp[i-1][1])。

//二是前一天(第i-1天)的之前賣出了股票,而不是前一天的當天賣出了股票,導致第i-1天結束時處于不持有股票的狀態(對應狀態dp[i-1][2])。

dp[i][2] = max(dp[i-1][1],dp[i-1][2]);

        for(int i = 1;i < n;i++){//第i天結束時處于持有股票的狀態,有兩種可能的原因://一是前一天(第i-1天)結束時就已經處于持有股票的狀態(對應狀態dp[i-1][0]),第i天什么也不做。//二是第i天買入了股票(需支付prices[i]),第i天能買入股票的前提是第i-1天結束時就已經處于不持有股票的狀態(并且第i-1天沒有賣出股票)(對應狀態dp[i-1][2])。dp[i][0] = max(dp[i-1][0],dp[i-1][2] - prices[i]);//第i天結束時處于不持有股票的狀態并且是因為第i天賣出了股票,第i天能賣出股票的前提是第i-1天結束時處于持有股票的狀態(對應dp[i-1][0])dp[i][1] = dp[i-1][0] + prices[i];//第i天結束時處于不持有股票的狀態并且第i天沒有賣出股票,有兩種可能的原因://一是前一天(第i-1天)賣出了股票導致第i-1天結束時處于不持有股票的狀態(對應狀態dp[i-1][1])。//二是前一天(第i-1天)的之前賣出了股票,而不是前一天的當天賣出了股票,導致第i-1天結束時處于不持有股票的狀態(對應狀態dp[i-1][2])。dp[i][2] = max(dp[i-1][1],dp[i-1][2]);}

第三步,理解dp數組如何初始化

dp[0][0] = -prices[0];//第0天結束時處于持有股票的狀態,那只能是因為第0天買入了股票(需支付prices[0]),利潤為負prices[0]

dp[0][1] = 0;//第0天結束時處于不持有股票的狀態,并且是因為第0天賣出了股票,可以理解為第0天先買入了股票然后又賣出了,最終利潤是0

dp[0][2] = 0;//第0天結束時處于不持有股票的狀態,并且第0天沒有賣出股票,只能是因為第i天什么也沒做,利潤保持為初始值0

第四步,理解遍歷順序

第i天的狀態依賴于第i-1天的狀態,因此i的遍歷順序應該從小到大。

代碼

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();//dp[i][0]表示從第0天開始一直到第i天結束時,處于持有股票的狀態,此時的最大利潤//dp[i][1]表示從第0天開始一直到第i天結束時,由于第i天賣出股票此時處于不持有股票的狀態,此時的最大利潤//dp[i][2]表示從第0天開始一直到第i天結束時,由于第i天之前賣出股票并且第i天沒有賣出股票此時處于不持有股票的狀態,此時的最大利潤vector<vector<int>> dp(n,vector<int>(3,0));dp[0][0] = -prices[0];//第0天結束時處于持有股票的狀態,那只能是因為第0天買入了股票(需支付prices[0]),利潤為負prices[0]dp[0][1] = 0;//第0天結束時處于不持有股票的狀態,并且是因為第0天賣出了股票,可以理解為第0天先買入了股票然后又賣出了,最終利潤是0dp[0][2] = 0;//第0天結束時處于不持有股票的狀態,并且第0天沒有賣出股票,只能是因為第i天什么也沒做,利潤保持為初始值0for(int i = 1;i < n;i++){//第i天結束時處于持有股票的狀態,有兩種可能的原因://一是前一天(第i-1天)結束時就已經處于持有股票的狀態(對應狀態dp[i-1][0]),第i天什么也不做。//二是第i天買入了股票(需支付prices[i]),第i天能買入股票的前提是第i-1天結束時就已經處于不持有股票的狀態(并且第i-1天沒有賣出股票)(對應狀態dp[i-1][2])。dp[i][0] = max(dp[i-1][0],dp[i-1][2] - prices[i]);//第i天結束時處于不持有股票的狀態并且是因為第i天賣出了股票,第i天能賣出股票的前提是第i-1天結束時處于持有股票的狀態(對應dp[i-1][0])dp[i][1] = dp[i-1][0] + prices[i];//第i天結束時處于不持有股票的狀態并且第i天沒有賣出股票,有兩種可能的原因://一是前一天(第i-1天)賣出了股票導致第i-1天結束時處于不持有股票的狀態(對應狀態dp[i-1][1])。//二是前一天(第i-1天)的之前賣出了股票,而不是前一天的當天賣出了股票,導致第i-1天結束時處于不持有股票的狀態(對應狀態dp[i-1][2])。dp[i][2] = max(dp[i-1][1],dp[i-1][2]);}return max(dp[n-1][1],dp[n-1][2]);}
};

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

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

相關文章

嵌入式硬件常用總線接口知識體系總結和對比

0.前言 在嵌入式工程實現中,多多少少我們都使用過總線,各種各樣的總線應用于不同場合,不同場景有不同的優勢,但是我們在作為工程師過程中在如何選擇項目合適的總線,根據什么來選?需要我們對項目全局和總線特征有所了解,本文目的就是對比多種總線的關鍵特征 我們在聊到…

數據分析處理庫Pandas常用方法匯總

目錄 一、基礎操作 1.1 創建df對象 1.1.1 讀入表格數據 1.1.2 手動創建df 1.2 .info() 1.3 df.index 1.4 df.columns 1.5 df.dtypes 1.6 df.values 1.7 .set_index() 1.8 df[xxx] 1.9 .describe() 1.10 .isin() 1.12 .where() 1.13 .query() 1.14 Series類型運算…

智慧大屏系統

延凡智慧大屏系統旨在打破數據壁壘&#xff0c;將海量、復雜的數據轉化為直觀易懂的可視化圖形和信息&#xff0c;廣泛應用于城市管理、企業運營、交通指揮、能源監控等多個領域&#xff0c;為管理者、決策者提供全面、實時、精準的信息展示和分析工具&#xff0c;助力高效決策…

樹莓派超全系列教程文檔--(32)config.txt常用音頻配置

config.txt常用音頻配置 板載模擬音頻&#xff08;3.5mm耳機插孔&#xff09;audio_pwm_modedisable_audio_ditherenable_audio_ditherpwm_sample_bits HDMI音頻 文章來源&#xff1a; http://raspberry.dns8844.cn/documentation 原文網址 板載模擬音頻&#xff08;3.5mm耳機…

23種設計模式全面解析

設計模式是解決軟件設計中常見問題的經典方案。根據《設計模式&#xff1a;可復用面向對象軟件的基礎》&#xff08;GoF&#xff09;&#xff0c;23種設計模式分為以下三類&#xff1a; 一、創建型模式&#xff08;5種&#xff09; 目標&#xff1a;解耦對象的創建過程&#x…

AI 推理框架詳解,包含如COT、ReAct、LLM+P等的詳細說明和分類整理,涵蓋其原理、應用場景及對比分析

AI 推理引擎 以下是關于 AI 推理引擎 的詳細說明&#xff0c;涵蓋其定義、類型、核心組件、技術實現、應用場景及挑戰&#xff1a; 1. 推理引擎的定義 推理引擎&#xff08;Inference Engine&#xff09;是 AI系統的核心組件&#xff0c;負責根據輸入數據、知識庫或預訓練模…

《探秘鴻蒙分布式軟總線:開啟無感發現與零等待傳輸新時代》

在數字化浪潮中&#xff0c;設備之間的互聯互通成為構建智能生態的關鍵。鴻蒙系統中的分布式軟總線技術&#xff0c;宛如一座橋梁&#xff0c;讓各種智能設備緊密相連。尤其是其實現的設備間無感發現和零等待傳輸功能&#xff0c;更是為用戶帶來了前所未有的便捷體驗&#xff0…

JDBC 與 MyBatis 詳解:從基礎到實踐

目錄 一、JDBC 介紹 二、使用 JDBC 查詢用戶信息 三、ResultSet 結果集 四、預編譯 SQL - SQL 注入問題 五、預編譯 SQL - 性能更高 六、JDBC 增刪改操作 插入數據&#xff1a; 更新數據&#xff1a; 刪除數據&#xff1a; 七、MyBatis 介紹 八、MyBatis 入門程序 引…

基于SpringBoot成績管理系統設計與實現(源碼+文檔+部署講解)

技術范圍&#xff1a;SpringBoot、Vue、SSM、HLMT、Jsp、PHP、Nodejs、Python、爬蟲、數據可視化、小程序、安卓app、大數據、物聯網、機器學習等設計與開發。 主要內容&#xff1a;免費功能設計、開題報告、任務書、中期檢查PPT、系統功能實現、代碼編寫、論文編寫和輔導、論文…

<sql>、<resultMap>、<where>、<foreach>、<trim>、<set>等標簽的作用和用法

目錄 一. sql 代碼片段標簽 二. resultMap 映射結果集標簽 三. where 條件標簽 四. set 修改標簽 五. trim 標簽 六. foreach 循環標簽 一. sql 代碼片段標簽 sql 標簽是 mybatis 框架中一個非常常用的標簽頁&#xff0c;特別是當一張表很有多個字段多&#xff0c;或者要…

《MySQL:MySQL數據庫的基本操作》

1.創建數據庫 CREATE DATABASE [IF NOT EXISTS] db_name [create_specification [, create_specification] ...] create_specification: [DEFAULT] CHARACTER SET charset_name [DEFAULT] COLLATE collation_name 大寫表示關鍵字[]&#xff1a;表示可選項CHARACTER SET ch…

深入簡出:KL散度、交叉熵、熵、信息量簡介、交叉熵損失

學習這些的最終目的 1、量化兩個概率分布的差異 2、推導交叉熵損失 一、KL散度 KL散度就是用來量化兩個概論分布的差異&#xff0c;如何量化&#xff1f; 計算真實概論分布P信息量 和 估計概論分布為Q&#xff0c;但實際概率分布為P時信息量的差值 那么設&#xff0c;概率分…

MySQL:Join連接的原理

連接查詢的執行過程&#xff1a; 確定第一個需要查詢的表【驅動表】 選取代價最小的訪問方法去執行單表查詢語句 從驅動表每獲取到一條記錄&#xff0c;都需要到t2表中查找匹配的記錄 兩表連接查詢需要查詢一次t1表&#xff0c;兩次t2表&#xff0c;在兩表的連接查詢中&…

【Drools+springboot3規則匹配】

文章目錄 一、 業務場景概述二、整體技術架構三、Drools概述1. Drools 簡介2. Drools Rete 算法與flink-cep的區別?2.1 Rete 算法概述2.2 Flink CEP 概述四、代碼實現4.1 導入依賴4.2 從kafka消費數據4.3 核心類,觸發匹配操作并將匹配數據寫入mysql4.4 Drools 管理4.5 相關的…

深入理解 Android Handler

一、引言 Handler 在安卓中的地位是不言而喻的&#xff0c;幾乎維系著整個安卓程序運行的生命周期&#xff0c;但是這么重要的一個東西&#xff0c;我們真的了解它嗎&#xff1f;下面跟隨著我的腳步&#xff0c;慢慢揭開Hanler的神秘面紗吧&#xff01; 本文將介紹Handler 的運…

讀書筆記 -- MySQL架構

1、MySQL邏輯架構 最上層的服務并不是 MySQL所獨有的&#xff0c;大多數基于網絡的客戶端/服務器的工具或者服務都有類似的架構。比如連接處理、授權認證、安全等等。 第二層架構是 MySQL 比較有意思的部分。大多數 MySQL 的核心服務功能都在這一層包括查詢解析、分析、…

linux 4.14內核jffs2文件系統不自動釋放空間的bug

前段時間在做spi-nor flash項目的時候&#xff0c;使用jffs2文件系統&#xff0c;發現在4.14內核下存在無法釋放空間的bug&#xff0c;后來進行了修復&#xff0c;修復后功能正常&#xff0c;現將修復patch公開&#xff0c;供后來者學習&#xff1a; diff --git a/fs/jffs2/ac…

vue3+vite 實現.env全局配置

首先創建.env文件 VUE_APP_BASE_APIhttp://127.0.0.1/dev-api 然后引入依賴&#xff1a; pnpm install dotenv --save-dev 引入完成后&#xff0c;在vite.config.js配置文件內加入以下內容&#xff1a; const env dotenv.config({ path: ./.env }).parsed define: { // 將…

Oracle 19c部署之手工建庫(四)

#Oracle #19c #手工建庫 手工創建Oracle數據庫&#xff08;也稱為手工建庫&#xff09;是指在已經安裝了Oracle數據庫軟件的基礎上&#xff0c;通過手動執行一系列命令和步驟來創建一個新的數據庫實例。這種方法與使用Database Configuration Assistant (DBCA)等工具自動創建數…