Day44:LeedCode 188.買賣股票的最佳時機IV 309.最佳買賣股票時機含冷凍期 714.買賣股票的最佳時機含手續費

188. 買賣股票的最佳時機 IV

給你一個整數數組?prices?和一個整數?k?,其中?prices[i]?是某支給定的股票在第?i?天的價格。

設計一個算法來計算你所能獲取的最大利潤。你最多可以完成?k?筆交易。也就是說,你最多可以買?k?次,賣?k?次。

注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。

示例 1:

輸入:k = 2, prices = [2,4,1]
輸出:2
解釋:在第 1 天 (股票價格 = 2) 的時候買入,在第 2 天 (股票價格 = 4) 的時候賣出,這筆交易所能獲得利潤 = 4-2 = 2 。

示例 2:

輸入:k = 2, prices = [3,2,6,5,0,3]
輸出:7
解釋:在第 2 天 (股票價格 = 2) 的時候買入,在第 3 天 (股票價格 = 6) 的時候賣出, 這筆交易所能獲得利潤 = 6-2 = 4 。隨后,在第 5 天 (股票價格 = 0) 的時候買入,在第 6 天 (股票價格 = 3) 的時候賣出, 這筆交易所能獲得利潤 = 3-0 = 3 。

提示:

  • 1 <= k <= 100
  • 1 <= prices.length <= 1000
  • 0 <= prices[i] <= 1000

思路:

1.確定dp數組以及下標的含義

使用二維數組 dp[i][j] :第i天的狀態為j,所剩下的最大現金是dp[i][j]

j的狀態表示為:

0 表示不操作
1 第一次持有
2 第一次賣出
3 第二次持有入
4 第二次賣出
.....
題目要求是至多有K筆交易,那么j的范圍就定義為 2 * k + 1 就可以了

2.確定遞推公式

達到dp[i][1]狀態,有兩個具體操作:

1)操作一:第i天買入第一支股票了,那么dp[i][1] = dp[i-1][0] - prices[i]

2)操作二:第i天沒有操作,而是沿用前一天買入第一支股票的狀態,即:dp[i][1] = dp[i - 1][1]

達到dp[i][2]狀態,有兩個具體操作:

1)操作一:第i天賣出第一支股票了,那么dp[i][2] = dp[i - 1][1] + prices[i]

2)操作二:第i天沒有操作,沿用前一天賣出第一支股票的狀態,即:dp[i][2] = dp[i - 1][2]

達到dp[i][3]狀態,有兩個具體操作:

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

達到dp[i][4]狀態,有兩個具體操作:

dp[i][4] = max(dp[i - 1][4], dp[i - 1][3] + prices[i]);

........同理可以類比剩下的狀態

if(i%2==1)

dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]-prices[i]);//買入

if(i%2==0)

dp[i][j]=max(dp[i-1][j],dp[i-1][j-1]+prices[i]);//賣出

3.dp數組如何初始化

可以推出dp[0][j]當j為奇數的時候都初始化為 -prices[0]

4.確定遍歷順序

從遞歸公式其實已經可以看出,一定是從前向后遍歷,因為dp[i],依靠dp[i - 1]的數值。

5.舉例

k=2,prices=[1,2,3,4]

代碼參考:

class Solution {public int maxProfit(int k, int[] prices) {int[][] dp=new int[prices.length][2*k+1];//初始化for(int i=1;i<2*k+1;i=i+2){dp[0][i]=-prices[0];}for(int i=1;i<prices.length;i++){
for(int j=1;j<2*k+1;j++){//奇數買入
if( j%2==1){
dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-1]-prices[i]);
}//偶數賣出if(j%2==0){dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-1]+prices[i]);}
}}return dp[prices.length-1][2*k];}
}

309. 買賣股票的最佳時機含冷凍期

給定一個整數數組prices,其中第??prices[i]?表示第?i?天的股票價格 。?

設計一個算法計算出最大利潤。在滿足以下約束條件下,你可以盡可能地完成更多的交易(多次買賣一支股票):

  • 賣出股票后,你無法在第二天買入股票 (即冷凍期為 1 天)。

注意:你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。

示例 1:

輸入: prices = [1,2,3,0,2]
輸出: 3 
解釋: 對應的交易狀態為: [買入, 賣出, 冷凍期, 買入, 賣出]

示例 2:

輸入: prices = [1]
輸出: 0

提示:

  • 1 <= prices.length <= 5000
  • 0 <= prices[i] <= 1000

思路:

將交易狀態化為四種

動態規劃五部曲:

1.確定dp數組以及下標的含義

dp[i][j],第i天狀態為j,所剩的最多現金為dp[i][j]。

j=0:今天購入了股票/以前購買了股票還沒賣出

j=1:今天賣出股票

j=2:冷凍期

j=3:今天沒有股票在手,且不是今天賣出的股票

2.確定遞推公式

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

dp[i][1]=dp[i-1][0]

dp[i][2]=dp[i-1][1]

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

3.初始化

dp[0][0]=-prices[0]

dp[0][1]=0

dp[0][2]=0

dp[0][3]=0

4.遍歷順序

從遞歸公式上可以看出,dp[i] 依賴于 dp[i-1],所以是從前向后遍歷。

5.舉例

代碼參考:

class Solution {public int maxProfit(int[] prices) {int[][] dp = new int[prices.length][4];//初始化dp[0][0]=0-prices[0];dp[0][1]=0;dp[0][2]=0;dp[0][3]=0;for(int i=1;i<prices.length;i++){dp[i][0]=Math.max(Math.max(dp[i-1][0],dp[i-1][2]-prices[i]),dp[i-1][3]-prices[i]);dp[i][1]=dp[i-1][0]+prices[i];dp[i][2]=dp[i-1][1];dp[i][3]=Math.max(dp[i-1][3],dp[i-1][2]);} int n=prices.length;int result=Math.max(Math.max(dp[n-1][3],dp[n-1][2]),dp[n-1][1]);return result;    }
}


714. 買賣股票的最佳時機含手續費

給定一個整數數組?prices,其中?prices[i]表示第?i?天的股票價格 ;整數?fee?代表了交易股票的手續費用。

你可以無限次地完成交易,但是你每筆交易都需要付手續費。如果你已經購買了一個股票,在賣出它之前你就不能再繼續購買股票了。

返回獲得利潤的最大值。

注意:這里的一筆交易指買入持有并賣出股票的整個過程,每筆交易你只需要為支付一次手續費。

示例 1:

輸入:prices = [1, 3, 2, 8, 4, 9], fee = 2
輸出:8
解釋:能夠達到的最大利潤:  
在此處買入?prices[0] = 1
在此處賣出 prices[3] = 8
在此處買入 prices[4] = 4
在此處賣出 prices[5] = 9
總利潤:?((8 - 1) - 2) + ((9 - 4) - 2) = 8

示例 2:

輸入:prices = [1,3,7,5,10,3], fee = 3
輸出:6

提示:

  • 1 <= prices.length <= 5 * 104
  • 1 <= prices[i] < 5 * 104
  • 0 <= fee < 5 * 104

思路:

手續費相當于也是買股票的成本的一部分

動態規劃五部曲:

1.確定dp數組以及下標的含義

dp[i][0],第i天狀態為持有/購買股票,能夠達到的最大利潤

dp[i][1],第i天狀態為不持有/賣出股票,能夠達到的最大利潤

2.確定遞推公式

dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]-prices[i]-fee)

dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]+prices[i])

3.初始化

dp[0][0]=-prices[0]-fee

dp[0][1]=0

4.遍歷順序

從遞歸公式上可以看出,dp[i] 依賴于 dp[i-1],所以是從前向后遍歷。

5.舉例

代碼參考:

class Solution {public int maxProfit(int[] prices, int fee) {int[][] dp= new int[prices.length][2];//初始化dp[0][0]=0-prices[0];dp[0][1]=0;//for(int i=1;i<prices.length;i++){dp[i][0]=Math.max(dp[i-1][0],dp[i-1][1]-prices[i]);dp[i][1]=Math.max(dp[i-1][1],dp[i-1][0]+prices[i]-fee);}return dp[prices.length-1][1];}
}

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

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

相關文章

[深度學習]卷積理解

單通道卷積 看這個的可視化就很好理解了 https://github.com/vdumoulin/conv_arithmetic/blob/master/README.md 多通道卷積 當輸入有多個通道時,卷積核需要擁有相同的通道數. 假設輸入有c個通道,那么卷積核的每個通道分別于相應的輸入數據通道進行卷積,然后將得到的特征圖對…

51單片機STC89C52RC——14.1 直流電機調速

目錄 目的/效果 1&#xff1a;電機轉速同步LED呼吸燈 2 通過獨立按鍵 控制直流電機轉速。 一&#xff0c;STC單片機模塊 二&#xff0c;直流電機 2.1 簡介 2.2 驅動電路 2.2.1 大功率器件直接驅動 2.2.2 H橋驅動 正轉 反轉 2.2.3 ULN2003D 引腳、電路 2.3 PWM&…

智能光伏開發都能用到什么軟件和工具?

隨著全球對可再生能源的日益重視和光伏技術的快速發展&#xff0c;智能光伏開發已成為推動能源轉型的重要力量。在光伏項目的全生命周期中&#xff0c;從設計、建設到運營管理&#xff0c;各種軟件和工具的應用發揮著至關重要的作用。 一、光伏系統設計軟件 1、PVsyst PVsyst…

Linux 端口

什么是虛擬端口 計算機程序之間的通訊&#xff0c;通過IP只能鎖定計算機&#xff0c;但是無法鎖定具體的程序。通過端口可以鎖定計算機上具體的程序&#xff0c;確保程序之間進行溝通。 IP地址相當于小區地址&#xff0c;在小區內可以有許多用戶&#xff08;程序&#xff09;&…

java并發編程 JUC-基礎篇 快速入門

1.進程與線程的概念 &#xff08;1&#xff09;進程 程序有指令與數據組成&#xff0c;指令要運行&#xff0c;數據要讀寫&#xff0c;就必須指令加載到CPU。數據加載到內容&#xff0c;指令運行需要用到磁盤。 當一個程序被運行時&#xff0c;從磁盤加載這個程序的代碼至內…

探索Vue Router:構建高效單頁面應用的指南

引言 Vue Router&#xff0c;作為Vue.js的官方路由管理器&#xff0c;為構建SPA提供了強大的支持 Vue Router 基礎 Vue Router 的基本概念和作用 Vue Router 是一個用于構建單頁面應用的 Vue.js 插件。它允許我們通過定義路由規則來將不同的 URL 映射到不同的組件&#xff…

1023記錄

米哈游二面 自動化測試中自動化驅動的能力&#xff1f; pytest的驅動能力&#xff1a; 1&#xff0c;自動發現測試用例&#xff1a;以"test_"開頭的Python文件、以"Test"開頭的類和以"test_"開頭的函數&#xff0c;將它們識別為測試用例 2&…

植物大戰僵尸融合版最新版1.0下載及安裝教程

《植物大戰僵尸融合版》最新版1.0已經發布&#xff0c;為粉絲們帶來了全新的游戲體驗。這個版本由B站UP主藍飄飄fly精心打造&#xff0c;引入了創新的植物融合玩法&#xff0c;讓玩家可以享受策略和創意的結合。以下是游戲的詳細介紹和安裝指南&#xff1a; 游戲特色介紹 全新…

基于深度學習的圖像背景剔除

在過去幾年的機器學習領域&#xff0c;我一直想打造真正的機器學習產品。 幾個月前&#xff0c;在參加了精彩的 Fast.AI 深度學習課程后&#xff0c;似乎一切皆有可能&#xff0c;我有機會&#xff1a;深度學習技術的進步使許多以前不可能實現的事情成為可能&#xff0c;而且開…

Java--繼承

1.繼承的本質是對某一批類的抽象&#xff0c;從而實現對世界更好的建模 2.extends的意思是“擴展”&#xff0c;子類是父親的擴展 3.Java中只有單繼承&#xff0c;沒有多繼承 4.繼承關系的兩個類&#xff0c;一個為子類&#xff08;派生類&#xff09;&#xff0c;一個為父類…

QML-Grid和OpacityMask

一個格子條&#xff0c;點擊縮短 import QtQuick 2.0 import QtQuick.Window 2.12 import QtQuick.Controls 2.5 //導入 import QtGraphicalEffects 1.12Window {id:windowwidth: 600height: 500color: "white"visible: trueGrid {visible: falseid:gridwidth:405he…

STAR 命令參數解釋

以這個為例子解釋STAR參數含義 STAR 命令參數解釋 STAR \ --outFilterType BySJout \ --runThreadN 8 \ --outFilterMismatchNmax 2 \ --genomeDir <hg19_STARindex> \ --readFilesIn <un_aligned.fastq> \ --outFileNamePrefix <HEK293> \ --outSAMtype B…

歐科云鏈大咖對話:Web3原生創新靜默期,科技巨頭卻在兩極化發展

出品&#xff5c;OKG Research 作者&#xff5c;Hedy Bi 上周末&#xff0c;歐科云鏈研究院接受FT中文的邀請&#xff0c;作為圓桌嘉賓參與了由FT中文網與上海交通大學上海高級金融學院聯合主辦的金融大師課。在圓桌環節&#xff0c;筆者與各位教授和金融行業科技創新前沿實踐…

案例精選 | 聚銘網絡助力南京市玄武區教育局構建內網日志審計合規體系

南京市玄武區教育局作為江蘇省教育領域的先鋒機構&#xff0c;其工作重點涵蓋了教育政策的實施、教育現代化與信息化的融合、教育資源的優化、教育質量的提升以及教育公平的促進。在這一背景下&#xff0c;網絡安全管理成為了確保教育信息化順利推進的關鍵環節之一。 根據玄武…

Nacos單機部署、集群部署以及Nacos默認持久化derby數據庫和配置mysql數據庫

1. Nacos Windows 下載 1.1 去nacos官網下載nacos-server 發布歷史 | Nacos 官網https://nacos.io/download/release-history/ 下載版本為 nacos-server-2.3.1.zip 2. Derby數據庫 2.1 默認使用Derby數據庫 官網下載Derby數據庫即可。 Apache Derby數據庫https://db.apac…

昇思25天學習打卡營第9天|MindSpore使用靜態圖加速(基于context的開啟方式)

在Graph模式下&#xff0c;Python代碼并不是由Python解釋器去執行&#xff0c;而是將代碼編譯成靜態計算圖&#xff0c;然后執行靜態計算圖。 在靜態圖模式下&#xff0c;MindSpore通過源碼轉換的方式&#xff0c;將Python的源碼轉換成中間表達IR&#xff08;Intermediate Repr…

VSCode遠程服務器

一、安裝VSCode Windows安裝Visual Studio Code(VS Code)-CSDN博客 二、VSCode中安裝Remote-SSH插件 1、在應用商店中搜索Remote - SSH并安裝 2、安裝后會出現下面標注的圖標 三、開始SSH連接 1、點擊加號&#xff0c;創建SSH連接 2、輸入地址&#xff0c;格式是&#xff1a;…

服務器部署 tomcat mysql nginx配置安裝

一、安裝配置tomcat 下載并解壓 Tomcat 首先,從 Apache Tomcat 官方網站下載最新版本的 Tomcat。以 Tomcat 9 為例:下載慢的話,也可以本地上傳到root目錄下進行解壓 sudo wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.58/bin/apache-tomcat-9.0.58.tar.gz sudo tar …

文件打開的系統錯誤分析流程

當用戶出現“Open file failed”錯誤時&#xff0c;手動產生dump文件。 &#xff08;1&#xff09;打開資源管理器&#xff0c;選擇AppNameXXX.exe進程&#xff0c;右擊鼠標選擇“創建轉儲文件” (2) 生成轉儲文件 3.獲取用戶轉儲文件 4.用Visual studio2015打開dump文件分析…

人工智能系列-numpy(三)

&#x1f308;個人主頁&#xff1a;羽晨同學 &#x1f4ab;個人格言:“成為自己未來的主人~” 副本和視圖 副本 副本是一個數據的完整的拷貝&#xff0c;如果我們對副本進行修改&#xff0c;它不會影響到原始數據&#xff0c;物理內存不再同一位置。副本一般發生在Pytho…