【錯題集-編程題】買賣股票的最好時機(四)(動態規劃)

力扣對應題目鏈接:188. 買賣股票的最佳時機 IV - 力扣(LeetCode)

牛客對應題目鏈接:買賣股票的最好時機(四)_牛客題霸_牛客網 (nowcoder.com)


一、分析題目

1、狀態表示

為了更加清晰的區分買入賣出,我們換成有股票無股票兩個狀態。

  • f[i][j] 表示:第 i 天結束后,完成了 j 筆交易,此時處于有股票狀態的最大收益。
  • g[i][j] 表示:第 i 天結束后,完成了 j 筆交易,此時處于無股票狀態的最大收益。

2、狀態轉移方程

對于 f[i][j],也有兩種情況能在第 i 天結束之后,完成 j 筆交易,此時手里有股票的狀態:

  • i-1 天的時候,手里有股票,并且交易了 j 次。在第 i 天的時候,啥也不干。此時的收益為 f[i - 1][j]
  • i-1 天的時候,手里沒有股票,并且交易了 j 次。在第 i 天的時候,買了股票。那么 i 天結束之后,就有股票了。此時的收益為 g[i - 1][j] - prices[i]

上述兩種情況,我們需要的是最大值,因此 f 的狀態轉移方程為:

f[i][j] = max(f[i - 1][j], g[i - 1][j] - prices[i]

對于 g[i][j],我們有下?兩種情況能在第 i 天結束之后,完成 j 筆交易,此時手里沒有股票的狀態:

  • i-1 天的時候,手里沒有股票,并且交易了 j 次。在第 i 天的時候,啥也不干。此時的收益為 g[i - 1][j]
  • i-1 天的時候,手里有股票,并且交易了 j - 1 次。在第 i 天的時候,把股票賣了。那么 i 天結束之后,我們就交易了 j 次。此時的收益為 f[i - 1][j - 1] + prices[i]

上述兩種情況,我們需要的是最大值,因此 g 的狀態轉移方程為:

g[i][j] = max(g[i - 1][j], f[i - 1][j - 1] + prices[i])

它們之間交易關系如下:


3、初始化

由于需要用到 i=0 時的狀態,因此我們初始化第一行即可。
  • 當處于第 0 天的時候,只能處于買入過?次的狀態,此時的收益為 -prices[0] ,因f[0][0] = - prices[0]
  • 為了取 max 的時候,?些不存在的狀態起不到干擾的作?,我們統統將它們初始化為 -INF(用?INT_MIN 在計算過程中會有溢出的風險,這? INF 折半取 0x3f3f3f3f ,足夠小即可)。

4、填表順序

從上往下填每一行,每一行從左往右,兩個表?起填。

5、返回值

返回處于賣出狀態的最大值,但是我們也不知道是交易了幾次,因此返回 g 表最后一行的最大值。


6、優化

我們的交易次數是不會超過整個天數的一半的,因此我們可以先把 k 處理一下,優化一下問題的規模:k = min(k, n / 2)


二、代碼

//力扣
//【動態規劃-二維dp-2個狀態】
class Solution {//f[i][j]:第i天結束后,完成了j次交易,此時處于“買入”狀態下的最大利潤//g[i][j]:第i天結束后,完成了j次交易,此時處于“賣出”狀態下的最大利潤
private:const int INF=0x3f3f3f3f;
public:int maxProfit(int k, vector<int>& prices) {int n=prices.size();k=min(k, n/2); //優化:處理最多交易次數vector<vector<int>> f(n, vector<int>(k+1, -INF));vector<vector<int>> g(n, vector<int>(k+1, -INF));f[0][0]=-prices[0], g[0][0]=0;for(int i=1; i<n; i++){for(int j=0; j<=k; j++){f[i][j]=max(f[i-1][j], g[i-1][j]-prices[i]);g[i][j]=g[i-1][j];if(j>=1) g[i][j]=max(g[i][j], f[i-1][j-1]+prices[i]);}}int res=0;for(int j=0; j<=k; j++)res=max(res, g[n-1][j]);return res;}
};//【動態規劃-二維dp-2k+1個狀態】
class Solution {//dp[i][0] -- 沒有操作//下面j為奇數:買入;j為偶數:賣出 (j的范圍:1~2k-1)//dp[i][j] -- 第1~k次買入//dp[i][j+1] -- 第1~k次賣出
public:int maxProfit(int k, vector<int>& prices) {int n=prices.size();vector<vector<int>> dp(n, vector<int>(2*k+1));for(int j=1; j<2*k; j+=2)dp[0][j]=-prices[0];for(int i=1; i<n; i++){for(int j=0; j<2*k; j+=2){dp[i][j+1]=max(dp[i-1][j+1], dp[i-1][j]-prices[i]);dp[i][j+2]=max(dp[i-1][j+2], dp[i-1][j+1]+prices[i]);}}return dp[n-1][2*k];}
};
//牛客
#include <iostream>
#include <cstring>
using namespace std;const int INF=0x3f3f3f3f;
const int N=1010, M=110;
int prices[N];
int f[N][M], g[N][M];
//f[i][j]:第i天結束后,完成了j次交易,此時處于“買入”狀態下的最大利潤
//g[i][j]:第i天結束后,完成了j次交易,此時處于“賣出”狀態下的最大利潤int main()
{int n, k;cin >> n >> k;for(int i=0; i<n; i++)cin >> prices[i];memset(f, -INF, sizeof(f));memset(g, -INF, sizeof(g));int res=0;f[0][0]=-prices[0], g[0][0]=0;for(int i=1; i<n; i++){for(int j=0; j<=k; j++){f[i][j]=max(f[i-1][j], g[i-1][j]-prices[i]);g[i][j]=g[i-1][j];if(j>0) g[i][j]=max(g[i][j], f[i-1][j-1]+prices[i]);res=max(res, g[i][j]);}}cout << res << endl;return 0;
}//值得學習的代碼
#include <iostream>
using namespace std;const int N = 1010, M = 110;int n, k, p[N];
int f[N][M], g[N][M];int main()
{cin >> n >> k;for(int i = 0; i < n; i++) cin >> p[i];k = min(k, n / 2);for(int j = 0; j <= k; j++) f[0][j] = g[0][j] = -0x3f3f3f3f;f[0][0] = -p[0], g[0][0] = 0;for(int i = 1; i < n; i++){for(int j = 0; j <= k; j++){f[i][j] = max(f[i - 1][j], g[i - 1][j] - p[i]);g[i][j] = g[i - 1][j];if(j >= 1) g[i][j] = max(g[i][j], f[i - 1][j - 1] + p[i]);}}int ret = 0;for(int j = 0; j <= k; j++) ret = max(ret, g[n - 1][j]);cout << ret << endl;return 0;
}

三、反思與改進

買賣股票這種類似有系列的題目,需要把核心知識點徹底弄熟。

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

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

相關文章

【鴻蒙學習筆記】通過用戶首選項實現數據持久化

官方文檔&#xff1a;通過用戶首選項實現數據持久化 目錄標題 使用場景第1步&#xff1a;源碼第2步&#xff1a;啟動模擬器第3步&#xff1a;啟動entry第6步&#xff1a;操作樣例2 使用場景 Preferences會將該數據緩存在內存中&#xff0c;當用戶讀取的時候&#xff0c;能夠快…

springboot對象參數賦值變化

java springboot 項目&#xff0c; 通過接口修改Person類 name值&#xff0c; 在別的類中&#xff0c;注入Person類 Resource Person person&#xff0c; 為什么拿不到 接口修改的 name的值&#xff0c;是Person類 不同的對象造成的 嗎 參數對象和注入對象區別 Person類&…

云WAF | 云waf基礎知識詳解

隨著數字時代的到來&#xff0c;網絡安全問題越來越突出&#xff0c; Web應用防火墻&#xff08;WAF&#xff09;是保障 Web應用安全的一道重要防線。在云計算環境下&#xff0c;云環路由云平臺&#xff08;WAF&#xff09;的出現&#xff0c;其融合了 WAF的能力和云計算的靈活…

【Linux】IP地址與主機名

文章目錄 1.IP地址2.特殊IP地址3.主機名4.域名解析 1.IP地址 每一臺聯網的電腦都會有一個地址&#xff0c;用于和其它計算機進行通訊 IP地址主要有2個版本&#xff0c;V4版本和V6版本 IPv4版本的地址格式是&#xff1a;a.b.c.d,其中abcd表示0~255的數字&#xff0c;如192.168.…

PS 2024【最新】中文白嫖版!,安裝教程,圖文步驟

文章目錄 軟件介紹軟件下載安裝步驟 軟件介紹 Photoshop&#xff0c;簡稱“PS” Adobe Photoshop&#xff0c;簡稱“PS”&#xff0c;是由Adobe Systems開發和發行的圖像處理軟件。Photoshop主要處理以像素所構成的數字圖像。使用其眾多的編修與繪圖工具&#xff0c;可以有效地…

利用AI快速上手新項目:開發者的高效指南

使用AI幫助開發者熟悉新的項目 在現代軟件開發中&#xff0c;開發者經常需要快速熟悉一個新的項目。項目可能包含復雜的結構和大量的文件&#xff0c;這對新手開發者來說無疑是一項挑戰。幸運的是&#xff0c;借助AI技術&#xff0c;我們可以更加高效地了解項目結構&#xff0…

道路運輸企業管理人員安全考核試題(附答案)

1、【多選題】《道路旅客運輸企業安全管理規范》規定&#xff0c;客運企業應當制定車輛動態監控操作規程。操作規程的內容包括( )。(ABCD) A、衛星定位裝置、視頻監控裝置、動態監控平臺設備的檢修和維護要求 B、動態監控信息采集、分析、處理規范和流程 C、違法違規信息統…

探索Facebook在人工智能領域的最新進展

在當今快速發展的科技領域中&#xff0c;人工智能&#xff08;AI&#xff09;作為一項關鍵技術&#xff0c;正在逐步改變著社交媒體的面貌。作為全球最大的社交平臺之一&#xff0c;Facebook積極探索和應用人工智能&#xff0c;以提升用戶體驗、增強平臺安全性并推動技術創新。…

Nodejs 第八十四章(ElasticSearch搜索)

ElasticSearch基本用法在之前的篇章介紹過了 這里不在過多闡述 模擬假數據 安裝庫 faker-js/faker 模擬假數據的一個庫非常好用支持中文使用中文 locale: [zh_CN], 設置即可生成名字&#xff0c;郵箱&#xff0c;手機號&#xff0c;id&#xff0c;年齡&#xff0c;性別生成完成…

ATT 和 GATT:數據表示和交換

背景介紹 BLE的通信和以太網&#xff0c;wifi有個重大的不同是&#xff1a;BLE通信的設備往往有特定的功能。且這個功能不會在運行中發生變化。 因此藍牙設備通信的時候&#xff0c;只能訪問預先定義好的&#xff08;也就是配置文件profile&#xff09;的功能。 那profile里寫…

批量制作word表格

問題背景 將excel表中的成績內容制作為成績單&#xff0c;每頁對應一個學員的成績&#xff0c;方便打印 代碼實現 ## 導入包 import pandas as pd from docx import Document from docx.enum.text import WD_ALIGN_PARAGRAPH,WD_LINE_SPACING# 讀取 Excel 內容 df pd.read_e…

APP接入聚合廣告SDK會影響上架應用市場嗎?

SDK是移動互聯網的基本技術接入方式&#xff0c;而廣告聚合SDK僅是實現廣告請求返回的功能&#xff0c;所以本身不會有任何問題&#xff0c;而各家應用市場會對具體的廣告展現方式等會有不同的要求&#xff0c;開發者可以根據具體的市場需要要求廣告平臺來配合進行相關設置即可…

精通 mysqldumpslow:深度分析 MySQL 慢查詢日志

引言 在數據庫管理與優化的領域中&#xff0c;慢查詢日志是識別性能瓶頸的金礦。mysqldumpslow 工具是挖掘這座金礦的利器&#xff0c;它幫助我們分析 MySQL 慢查詢日志并提取關鍵信息。本文將詳細介紹 mysqldumpslow 的核心選項&#xff0c;并通過實例展示如何使用這些選項來…

IP 地址:優化網絡游戲

IP地址和網絡游戲 在現代網絡游戲中&#xff0c;IP地址不僅用于服務器分配&#xff0c;還能針對性進行玩家匹配與優化網絡延遲。本文將探討IP地址在網絡游戲中的具體應用。 *服務器分配* 全球服務器分布&#xff1a; 網絡游戲需要在全球范圍內提供快速、穩定的連接&#xff…

筆記

https://qoj.ac/problem/8008 不難發現&#xff0c; 隨機到某些位置&#xff0c;之后最短路 先O&#xff08;nm&#xff09;預處理出能到的點&#xff0c; 考慮最小的隨機位置 首先&#xff0c;我們將求和式進行展開&#xff1a; ∑ j 1 ∞ j ( n ? i n ) j ? 1 i n \s…

libcoap3對接華為云平臺

文章目錄 前言一、平臺注冊二、引入源碼庫1.libcoap倉庫編譯2.分析網絡報文3.案例代碼4.編譯&運行 總結 前言 通過libcoap3開源代碼庫對接華為云平臺&#xff0c;本文章將討論加密與不加密的方式對接華為云平臺。 一、平臺注冊 首先&#xff0c;你需要在華為云平臺上創建…

文華財經盤立方博易大師boll布林帶指標公式源碼

TT:TIME>850&&TIME<1150; MID:MA(CLOSE,26);//求N個周期的收盤價均線&#xff0c;稱為布林通道中軌 TMP2:STD(CLOSE,26);//求M個周期內的收盤價的標準差 TOP:MID2*TMP2;//布林通道上軌 BOTTOM:MID-2*TMP2;//布林通道下軌 A:EVERY(ISDOWN,2)&&TT&&…

【鴻蒙學習筆記】使用axios進行HTTP數據請求

官方文檔&#xff1a;網絡管理開發概述 目錄標題 訪問淘寶公開接口&#xff08;測試數據&#xff09;第1步&#xff1a;module.json5 配置網絡授權第2步&#xff1a;下載axios第3步&#xff1a;源碼第4步&#xff1a;啟動模擬器第5步&#xff1a;啟動entry第6步&#xff1a;操…

python中from import的用法詳解

在Python中&#xff0c;from ... import ... 語句用于從指定的模塊、包或對象中導入特定的類、函數、變量等。這種導入方式可以讓你在代碼中使用這些元素時不需要每次都指定它們所屬的模塊名&#xff0c;從而簡化代碼&#xff0c;提高可讀性。下面詳細解釋這個語法的用法。 基…

Linux 常用命令 - mkdir【創建新目錄】

簡介 mkdir 源自于 make directory 的縮寫&#xff0c;該命令在 Linux 中用于創建一個或多個新目錄。默認情況下&#xff0c;它創建的是空目錄&#xff0c;如果待創建的目錄已存在&#xff0c;則會提示已存在而不能繼續創建&#xff0c;不會覆蓋已有文件。如果目錄不存在&…