【動態規劃】簡單多狀態(二)

📝前言說明:

  • 本專欄主要記錄本人的基礎算法學習以及LeetCode刷題記錄,按專題劃分
  • 每題主要記錄:(1)本人解法 + 本人屎山代碼;(2)優質解法 + 優質代碼;(3)精益求精,更好的解法和獨特的思想(如果有的話)
  • 文章中的理解僅為個人理解。如有錯誤,感謝糾錯

🎬個人簡介:努力學習ing
📋本專欄:C++刷題專欄
📋其他專欄:C語言入門基礎,python入門基礎,C++學習筆記,Linux
🎀CSDN主頁 愚潤澤

你可以點擊下方鏈接,進行不同專題的動態規劃的學習

點擊鏈接開始學習
斐波那契數列模型路徑問題
簡單多狀態(一)簡單多狀態(二)
子數組系列(一)子數組系列(二)
子序列問題(一)子序列問題(二)
回文串問題兩個數組dp問題(一)
兩個數組的dp問題(二)01背包問題
完全背包二維的背包問題
其他

題目

  • 309. 買賣股票的最佳時機含冷凍期
    • 優質解
  • 714. 買賣股票的最佳時機含手續費
    • 個人解
  • 123. 買賣股票的最佳時機 III
    • 優質解
  • 188. 買賣股票的最佳時機 IV
    • 個人解


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

題目鏈接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-cooldown/description/
在這里插入圖片描述

優質解

思路:

  • 本題的三狀態怎么來的,本來是買(已賣) / 賣,但是本題多了一個冷凍期,限制的是當天買的行為,所以變成了三狀態。已賣 + 可買 / 已賣 + 不可買 / 賣
  • dp[i]:當天結束時,最大收益。當天結束后的狀態又可以再細分(開 3 * n的數組)。
    • 持股dp[0]
    • dp[1]不持股且明天不可以買
    • dp[2]不持股且明天可以買
  • 狀態轉移方程(當天結束的狀態:由前一天狀態和當天行為決定):
    • 可變成持股狀態的:
      • 前一天不持股且明天可以買 + 當天買入;
      • 前一天持股 + 當天不變
    • 可變成不持股且明天不可買的:
      • 前一天持股 + 當天賣出
    • 可變成不持股且明天可買的:
      • 前一天不持股且明天可買 + 當天不變;
      • 前一天不持股且明天不可買 + 當天不變
  • 由上可推出方程
  • dp[0][i] = max(dp[2][i - 1] - price[i], dp[0][i - 1])
  • dp[1][i] = dp[0][i - 1] + price[i]
  • dp[2][i] = max(dp[1][i - 1], dp[2][i - 1])
  • 初始化:dp[0][0] = -price[0]dp[1][0] = dp[2][0] = 0
  • 填表順序:三個一起填
  • 返回值:max(dp[1][n - 1], dp[2][n - 1])
class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size(); vector<vector<int>> dp(3, vector(n, 0));dp[0][0] = -prices[0];for(int i = 1; i < n; i++){dp[0][i] = max(dp[2][i - 1] - prices[i], dp[0][i - 1]);dp[1][i] = dp[0][i - 1] + prices[i];dp[2][i] = max(dp[1][i - 1], dp[2][i - 1]);}return max(dp[1][n - 1], dp[2][n - 1]);}
};

時間復雜度:O(n)
空間復雜度:O(n)


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

題目鏈接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-with-transaction-fee/description/
在這里插入圖片描述

個人解

思路:

// dp[0][i] 第 i 天結束后為持股狀態時的最大收益
// dp[1][i] 第 i 天結束后為不持股狀態時的最大收益
// dp[0][i] = max(dp[1][i - 1] - prices[i] - fee, dp[0][i - 1]);
// dp[1][i] = max(dp[1][i - 1], dp[0][i - 1] + prices[i]);

不多說了,難度不如上一題
用時:10:00
屎山代碼:

class Solution {
public:int maxProfit(vector<int>& prices, int fee) {int n = prices.size();vector<vector<int>> dp(2, vector(n, 0));dp[0][0] = -prices[0] - fee; // 讓買入算手續費for(int i = 1; i < n; i++){dp[0][i] = max(dp[1][i - 1] - prices[i] - fee, dp[0][i - 1]);dp[1][i] = max(dp[1][i - 1], dp[0][i - 1] + prices[i]);}return dp[1][n - 1];}
};

時間復雜度:O(n)
空間復雜度:O(n)


123. 買賣股票的最佳時機 III

題目鏈接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iii/description/
在這里插入圖片描述

優質解

思路:

  • 通過分析狀態表示,我們發現必須要三維才能夠很好的表示狀態
  • 第一維:持股 / 不持股,第二維:最大利潤 ,第三維:所剩交易次數

但是我們也可以把持股和不持股分出來:

  • f[i][j] : "持股"狀態,第i天結束之后,完成了j次交易,的最大利潤
  • g[i][j] : "不持股"狀態,第i天結束之后,完成了j次交易,的最大利潤

在這里插入圖片描述
可見,下標直接表示交易次數
我們規定,只有在賣出的時候,交易次數才++
則狀態轉移方程:

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

初始化(其實是解決越界行為):

  • 初始時,交易次數為 1 和 2 的初始化
    • 我們可以讓f[0][1] = f[0][2] = - INT_MAX / 2,即:取最小值(比所有可能的結果都小),使得該位置不會被下一天max選到,從而不影響正常的狀態轉移(g同理)
    • /2的原因:因為g[i - 1][j] - prices[i]會導致負數溢出,所以控制一下
  • f[i - 1][j - 1] + prices[i]的操作:j - 1會越界
    • 而這個式子中j等于0是無意義的,因為如果當天有賣出行為,則g[i][j]j一定 >= 1
    • 因此,我們可以把式子變換成:
g[i][j] = g[i - 1][j];
if(j > 1)g[i][j] = max(g[i - 1][j], f[i - 1][j - 1] + prices[i]);
  • 是從第1天開始填的,基于第0天,所以:f[0][0] = -p[0]g[0][0] = 0

代碼:

class Solution {
public:int maxProfit(vector<int>& prices) {int n = prices.size();vector<vector<int>> f(n, vector<int>(3, -INT_MAX / 2));auto g = f;f[0][0] = -prices[0]; g[0][0] = 0;for(int i = 1; i < n; i++){for(int j = 0; j < 3; 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 - 1][j], f[i - 1][j - 1] + prices[i]);}}return max(max(g[n - 1][0], g[n - 1][1]), g[n - 1][2]);}
};

時間復雜度:O(n)
空間復雜度:O(n)


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

題目鏈接:https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-iv/description/
在這里插入圖片描述

個人解

思路:

  • 和上一題一樣

用時:6:00
屎山代碼:

class Solution {
public:int maxProfit(int k, vector<int>& prices) {int n = prices.size();vector<vector<int>> f(n, vector<int>(k + 1, -INT_MAX/2));auto g = f;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 - 1][j], f[i - 1][j - 1] + prices[i]);}}int ans = 0;for(int i = 0; i <= k; i++)ans = max(ans, g[n - 1][i]);return ans;}
};

時間復雜度: O ( n ? k ) O(n * k) O(n?k)
空間復雜度: O ( n ? k ) O(n * k) O(n?k)


🌈我的分享也就到此結束啦🌈
要是我的分享也能對你的學習起到幫助,那簡直是太酷啦!
若有不足,還請大家多多指正,我們一起學習交流!
📢公主,王子:點贊👍→收藏?→關注🔍
感謝大家的觀看和支持!祝大家都能得償所愿,天天開心!!!

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

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

相關文章

如何選擇支持AI接入的開發語言與框架

選擇支持AI接入的開發語言與框架 在AI系統開發中,語言和框架的選擇不僅決定了代碼實現方式,更深刻影響模型服務的接入效率、調用方式、性能表現和未來的可維護性。相比傳統后端系統的語言選擇只需關注并發性能或生態成熟度,AI架構下的開發語言必須同時滿足以下幾類能力: 具…

計算機視覺與深度學習 | Python實現CEEMDAN-ABC-VMD-DBO-CNN-LSTM時間序列預測(完整源碼和數據)

以下是一個結合CEEMDAN、ABC優化VMD、DBO優化CNN-LSTM的完整時間序列預測實現方案。該方案包含完整的數據生成、算法實現和模型構建代碼。 完整實現代碼 import numpy as np import pandas as pd from PyEMD import CEEMDAN from vmdpy import VMD from sklearn.preprocessing…

React19源碼系列之渲染階段performUnitOfWork

在 React 內部實現中&#xff0c;將 render 函數分為兩個階段&#xff1a; 渲染階段提交階段 其中渲染階段可以分為 beginWork 和 completeWork 兩個階段&#xff0c;而提交階段對應著 commitWork。 在之前的root.render過程中&#xff0c;渲染過程無論是并發模式執行還是同…

c# 解碼 encodeURIComponent

在C#中&#xff0c;如果你需要解碼由encodeURIComponent方法編碼的URL&#xff0c;你可以使用System.Web命名空間中的HttpUtility.UrlDecode方法。這個方法可以處理由JavaScript的encodeURIComponent方法編碼的字符串。 首先&#xff0c;確保你的項目中引用了System.Web命名空…

Python學習心得:代碼森林的冒險

第一章&#xff1a;迷霧中的第一步 林然從未想過自己會與代碼結緣。那是一個平淡的周六清晨&#xff0c;陽光穿過窗簾&#xff0c;灑在她那臺老舊的筆記本電腦上。屏幕上&#xff0c;Python的安裝界面靜靜地等待著她的決定。她是一個文科生&#xff0c;大學主修社會學&#xf…

展示了一個三軸(X, Y, Z)坐標系!

等軸測投影”&#xff08;isometric projection&#xff09;風格的手繪風格三維圖&#xff0c;即三條坐標軸&#xff08;x?, x?, x?&#xff09;看起來彼此垂直、等角分布&#xff08;通常是 120 夾角&#xff09;&#xff0c;它是常見于教材和數學書籍的 “假三維”表示法。…

計算機網絡 - 2.基礎協議

1.TCP協議 1.TCP(Transmission Control Protocol):傳輸控制協議2.TCP協議是一種面向連接的、可靠的、 基于字節流的傳輸層通信協議 1.面向連接:兩個使用TCP協議的應用(通常一個客戶和一個服務器)在彼此交換數據包之前必須先建立一個TCP連接2.可靠的 1.數據傳輸之前都要建立…

前端之vue3創建基本工程,基本登錄、注冊等功能的完整過程

此文也是為了做一個基本學習用的vue3創建項目的過程&#xff0c;包含基本的登錄頁面、登出頁面、基本的router跳轉、axios調用、登錄驗證等內容。與項目&#xff1a; https://gitee.com/rainpet/java-web-demo/tree/master/spring-security01 可以配套使用。 如下為主要過程。 …

如果有三個服務實例部署在三臺不同的服務器上,這三個服務實例的本地緩存,是存儲一模一樣的數據?還是各自只存一部分?

? 答案是&#xff1a;通常每個服務實例都會獨立地緩存它自己訪問過的數據&#xff0c;這些數據可能是相同的&#xff0c;也可能是不同的&#xff0c;取決于請求的內容。 &#x1f4cc; 舉個例子說明 假設你有一個商品詳情頁的服務&#xff0c;部署了 3 個服務實例&#xff08…

九州未來十三載:開源賦能 智啟未來

2012年&#xff0c;九州未來以“開源賦能云邊變革”為使命&#xff0c;開啟中國開放云邊基礎架構服務的探索之路。十三載堅守深耕&#xff0c;我們始終以開源為翼&#xff0c;以算力為基&#xff0c;在科技浪潮中砥礪前行&#xff0c;見證并推動著AI時代的算力變革。 堅守初心丨…

Axure項目實戰:智慧運輸平臺后臺管理端-訂單管理1(多級交互)

親愛的小伙伴,在您瀏覽之前,煩請關注一下,在此深表感謝!如有幫助請訂閱專欄! Axure產品經理精品視頻課已登錄CSDN可點擊學習https://edu.csdn.net/course/detail/40420 課程主題:訂單管理 主要內容:條件組合、中繼器篩選、表單跟隨菜單拖動、審批數據互通等 應用場景…

WebAssembly:開啟跨平臺高性能編程的新時代

在當今的互聯網時代&#xff0c;Web 應用的復雜性和性能要求越來越高。從簡單的網頁瀏覽到復雜的在線游戲、實時數據處理和圖形渲染&#xff0c;開發者需要一種能夠兼顧性能和兼容性的技術。WebAssembly&#xff08;簡稱 Wasm&#xff09;應運而生&#xff0c;它作為一種新興的…

大數據治理:理論、實踐與未來展望(二)

書接上文 文章目錄 七、大數據治理的未來發展趨勢&#xff08;一&#xff09;智能化與自動化&#xff08;二&#xff09;數據隱私與安全的強化&#xff08;三&#xff09;數據治理的云化&#xff08;四&#xff09;數據治理的跨行業合作&#xff08;五&#xff09;數據治理的生…

計算機視覺與深度學習 | Matlab實現EMD-GWO-SVR、EMD-SVR、GWO-SVR、SVR時間序列預測(完整源碼和數據)

以下是一個完整的Matlab時間序列預測實現方案,包含EMD-GWO-SVR、EMD-SVR、GWO-SVR和SVR四種方法的對比。代碼包含數據生成、信號分解、優化算法和預測模型實現。 %% 主程序:時間序列預測對比實驗 clc; clear; clearvars; close all;% 生成模擬時間序列數據 rng(1); % 固定隨…

RabbitMQ核心特性——重試、TTL、死信隊列

一、重試機制 在消息傳輸過程中&#xff0c;可能遇到各種問題&#xff0c;如網絡故障&#xff0c;服務器不可用等&#xff0c;這些問題可能導致消息處理失敗&#xff0c;因此RabbitMQ提供了重試機制&#xff0c;允許消息處理失敗后重新發送&#xff0c;但是&#xff0c;如果是因…

MVCC實現原理

MVCC的基本概念 MVCC&#xff0c;一個數據的多個版本&#xff0c;使得讀寫操作沒有沖突。 在多個事務并發的情況下&#xff0c;確定到底要訪問哪個版本。 MVCC實現原理 MVCC實現依賴于隱式字段&#xff0c;undo log日志&#xff0c;readView 隱式字段 在mysql用戶自定義的…

湖北理元理律師事務所債務優化方案解析:如何科學規劃還款保障生活質量

在當前經濟環境下&#xff0c;債務問題已成為困擾許多家庭的重要難題。據相關統計數據顯示&#xff0c;我國個人負債率呈現逐年上升趨勢&#xff0c;如何合理規劃還款、保障基本生活質量成為亟待解決的社會問題。湖北理元理律師事務所基于多年實務經驗&#xff0c;研發出一套科…

ffmpeg 轉換視頻格式

使用FFmpeg將視頻轉換為MP4格式的常用命令&#xff1a; ffmpeg -i input.mov -c:v libx264 -crf 23 -c:a aac output.mp4 -i input.avi&#xff1a;指定輸入文件 -c:v libx264&#xff1a;使用H.264視頻編碼器 -crf 23&#xff1a;控制視頻質量&#xff08;范圍18-28&#…

LLM Tuning

Lora-Tuning 什么是Lora微調&#xff1f; LoRA&#xff08;Low-Rank Adaptation&#xff09; 是一種參數高效微調方法&#xff08;PEFT, Parameter-Efficient Fine-Tuning&#xff09;&#xff0c;它通過引入低秩矩陣到預訓練模型的權重變換中&#xff0c;實現無需大規模修改…

實現tdx-hs300-mcp

文章目錄 項目簡介功能說明使用方法配置說明項目簡介 tdx-hs300-mcp是一個Model Context Protocol (MCP)的服務 功能說明 下載數據自動保存為CSV格式文件使用方法 確保已安裝Python 3.7+和依賴庫: pip install pytdx fastapi uvicorn啟動MCP服務: mcp run MCP.py使用MCP工具…