国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

動態(tài)規(guī)劃——買賣股票的最佳時機(jī)系列題Ⅱ

這篇具有很好參考價值的文章主要介紹了動態(tài)規(guī)劃——買賣股票的最佳時機(jī)系列題Ⅱ。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報違法"按鈕提交疑問。

這一期是和上一期是連著的,包含的題目如下:

動態(tài)規(guī)劃——買賣股票的最佳時機(jī)系列題Ⅱ,動態(tài)規(guī)劃,算法

這三個題目所需要的思路是很相近的,先給出第一個的題目。

給定一個數(shù)組,它的第 i 個元素是一支給定的股票在第 i 天的價格。

設(shè)計一個算法來計算你所能獲取的最大利潤。你最多可以完成?兩筆?交易。

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

  • 示例?1:

  • 輸入:prices = [3,3,5,0,0,3,1,4]

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

  • 示例 2:

  • 輸入:prices = [1,2,3,4,5]

  • 輸出:4 解釋:在第 1 天(股票價格 = 1)的時候買入,在第 5 天 (股票價格 = 5)的時候賣出, 這筆交易所能獲得利潤 = 5-1 = 4。注意你不能在第 1 天和第 2 天接連購買股票,之后再將它們賣出。因為這樣屬于同時參與了多筆交易,你必須在再次購買前出售掉之前的股票。

  • 示例 3:

  • 輸入:prices = [7,6,4,3,1]

  • 輸出:0 解釋:在這個情況下, 沒有交易完成, 所以最大利潤為0。

  • 示例 4:

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

提示:

  • 1 <=?prices.length <= 10^5
  • 0 <=?prices[i] <=?10^5

第一步——理解題意

就是給你一個數(shù)組,交易最多兩次,獲得最大金額。

第二步——思考遞歸狀態(tài)

先看一下示例一:

  • 示例?1:

  • 輸入:prices = [3,3,5,0,0,3,1,4]

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

我們可以把這個分為五部分——|3,3,5|0,0|3|1|4|

  1. 沒有操作 (其實(shí)我們也可以不設(shè)置這個狀態(tài))——3,3,5
  2. 第一次持有股票——0,0
  3. 第一次不持有股票——3(此時正好賣出)
  4. 第二次持有股票——1
  5. 第二次不持有股票——4(此時正好賣出)

它們對應(yīng)的遞歸公式是這樣的:

            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]);

第三步——進(jìn)行初始化

dp[0][0]=0;(因為這個時候還什么都沒干)

dp[0][1]=-prices[0];(因為這個時候買入第一次)

dp[0][2]=0;(先初始化為0,避免影響后面的賺的金額)

dp[0][3]=-prices[0];(也把它初始化為prices[0],是因為有可能整個數(shù)組只需要一次交易,不需要第二次交易)

dp[0][4]=0;(同理,先初始化為0,避免影響后面的賺的金額)

給出代碼:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len=prices.size();
        if(len==0) return 0;
        vector<vector<int>>dp(len,vector<int>(5,0));
        dp[0][1]=-prices[0];
        dp[0][3]=-prices[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];
    }
};

這個題目就到此結(jié)束了,但接下來還有兩個跟他很相似的題目:

買賣股票的最佳時機(jī)IV

它和題1的不同就是把這個次數(shù)給抽象化了——你最多可以完成 k 筆交易

狀態(tài)表示為:

  • 0 表示不操作
  • 1 第一次買入
  • 2 第一次賣出
  • 3 第二次買入
  • 4 第二次賣出
  • .....

除了0以外,偶數(shù)就是賣出,奇數(shù)就是買入

題目要求是至多有K筆交易,那么j的范圍就定義為 2 * k + 1 就可以了。

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {

        if (prices.size() == 0) return 0;
        vector<vector<int>> dp(prices.size(), vector<int>(2 * k + 1, 0));
        for (int j = 1; j < 2 * k; j += 2) {
            dp[0][j] = -prices[0];
        }
        for (int i = 1;i < prices.size(); i++) {
            for (int j = 0; j < 2 * k - 1; 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[prices.size() - 1][2 * k];
    }
};

最佳買賣股票時機(jī)含冷凍期

  • 你不能同時參與多筆交易(你必須在再次購買前出售掉之前的股票)。
  • 賣出股票后,你無法在第二天買入股票 (即冷凍期為 1 天)。

注意這里是可以盡可能完成更多的交易,所以它這里是和買賣股票的最佳時機(jī)II相似,就是多了一個狀態(tài),有一天冷凍期。

狀態(tài)表示為:

  • 0 表示不操作
  • 1 第一次買入
  • 2 第一次賣出
  • 3 第一次冷凍期
  • 4 第二次買入
  • .....

這里是沒有次數(shù)的限制的文章來源地址http://www.zghlxwxcb.cn/news/detail-803718.html

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        if (n == 0) return 0;
        vector<vector<int>> dp(n, vector<int>(4, 0));
        dp[0][0] -= prices[0]; // 持股票
        for (int i = 1; i < n; i++) {
            dp[i][0] = max(dp[i - 1][0], max(dp[i - 1][3] - prices[i], dp[i - 1][1] - prices[i]));
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][3]);
            dp[i][2] = dp[i - 1][0] + prices[i];
            dp[i][3] = dp[i - 1][2];
        }
        return max(dp[n - 1][3], max(dp[n - 1][1], dp[n - 1][2]));
    }
};

到了這里,關(guān)于動態(tài)規(guī)劃——買賣股票的最佳時機(jī)系列題Ⅱ的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • LeetCode:121.買賣股票的最佳時機(jī)——動態(tài)規(guī)劃

    LeetCode:121.買賣股票的最佳時機(jī)——動態(tài)規(guī)劃

    ??道阻且長,行則將至。?? ??算法,不如說它是一種思考方式?? 算法專欄: ????123 關(guān)于動態(tài)規(guī)劃:LeetCode:322. 零錢兌換——動態(tài)規(guī)劃從案例入門 題目描述 :給定一個數(shù)組 prices ,它的第 i 個元素 prices[i] 表示一支給定股票第 i 天的價格。 你只能選擇 某一天 買入這只

    2023年04月17日
    瀏覽(22)
  • 【Day53】代碼隨想錄之動態(tài)規(guī)劃part10——買賣股票的最佳時機(jī)、買賣股票的最佳時機(jī)II

    【Day53】代碼隨想錄之動態(tài)規(guī)劃part10——買賣股票的最佳時機(jī)、買賣股票的最佳時機(jī)II

    昨天已經(jīng)把打家劫舍的問題解決了,最后一個題目涉及到樹形dp比較難(等到二刷的時候再重點(diǎn)看下),今天的任務(wù)是解決股票問題。 今日任務(wù): 121.買賣股票的最佳時機(jī) 122.買賣股票的最佳時機(jī)II Leetcode題目:【121.買賣股票的最佳時機(jī)】 因為此題中買賣股票只能買賣一次。

    2024年03月15日
    瀏覽(33)
  • DAY55:動態(tài)規(guī)劃(買賣股票的最佳時機(jī)3)

    DAY55:動態(tài)規(guī)劃(買賣股票的最佳時機(jī)3)

    這道題比上面狀態(tài)更多,是因為賣出股票后,你無法在第二天買入股票 (即冷凍期為1天)。 狀態(tài) 狀態(tài)一:持有股票狀態(tài)(今天買入股票,或者是之前就買入了股票然后沒有操作,一直持有) 不持有股票狀態(tài),這里就有兩種賣出股票狀態(tài) 狀態(tài)二:保持賣出股票的狀態(tài)(兩天前

    2024年02月22日
    瀏覽(28)
  • 【學(xué)會動態(tài)規(guī)劃】買賣股票的最佳時機(jī) III(17)

    【學(xué)會動態(tài)規(guī)劃】買賣股票的最佳時機(jī) III(17)

    目錄 動態(tài)規(guī)劃怎么學(xué)? 1. 題目解析 2. 算法原理 1. 狀態(tài)表示 2. 狀態(tài)轉(zhuǎn)移方程 3. 初始化 4. 填表順序 5. 返回值 3. 代碼編寫 寫在最后: 學(xué)習(xí)一個算法沒有捷徑,更何況是學(xué)習(xí)動態(tài)規(guī)劃, 跟我一起刷動態(tài)規(guī)劃算法題,一起學(xué)會動態(tài)規(guī)劃! 題目鏈接:123. 買賣股票的最佳時機(jī) II

    2024年02月13日
    瀏覽(24)
  • 【學(xué)會動態(tài)規(guī)劃】買賣股票的最佳時機(jī) IV(18)

    【學(xué)會動態(tài)規(guī)劃】買賣股票的最佳時機(jī) IV(18)

    目錄 動態(tài)規(guī)劃怎么學(xué)? 1. 題目解析 2. 算法原理 1. 狀態(tài)表示 2. 狀態(tài)轉(zhuǎn)移方程 3. 初始化 4. 填表順序 5. 返回值 3. 代碼編寫 寫在最后: 學(xué)習(xí)一個算法沒有捷徑,更何況是學(xué)習(xí)動態(tài)規(guī)劃, 跟我一起刷動態(tài)規(guī)劃算法題,一起學(xué)會動態(tài)規(guī)劃! 題目鏈接:188. 買賣股票的最佳時機(jī) IV

    2024年02月13日
    瀏覽(33)
  • 【學(xué)會動態(tài)規(guī)劃】最佳買賣股票時機(jī)含冷凍期(15)

    【學(xué)會動態(tài)規(guī)劃】最佳買賣股票時機(jī)含冷凍期(15)

    目錄 動態(tài)規(guī)劃怎么學(xué)? 1. 題目解析 2. 算法原理 1. 狀態(tài)表示 2. 狀態(tài)轉(zhuǎn)移方程 3. 初始化 4. 填表順序 5. 返回值 3. 代碼編寫 寫在最后: 學(xué)習(xí)一個算法沒有捷徑,更何況是學(xué)習(xí)動態(tài)規(guī)劃, 跟我一起刷動態(tài)規(guī)劃算法題,一起學(xué)會動態(tài)規(guī)劃! 題目鏈接:309. 最佳買賣股票時機(jī)含冷凍

    2024年02月14日
    瀏覽(40)
  • 動態(tài)規(guī)劃-狀態(tài)機(jī)(188. 買賣股票的最佳時機(jī) IV)

    動態(tài)規(guī)劃-狀態(tài)機(jī)(188. 買賣股票的最佳時機(jī) IV)

    狀態(tài)分類: f[i,j,0]考慮前i只股票,進(jìn)行了j筆交易,目前未持有股票 所能獲得最大利潤 f[i,j,1]考慮前i只股票,進(jìn)行了j筆交易,目前持有股票 所能獲得最大利潤 狀態(tài)轉(zhuǎn)移: f[i][j][0] = Math.max(f[i-1][j][0],f[i-1][j][1]+prices[i]); f[i][j][1] = Math.max(f[i-1][j][1],f[i-1][j-1][0]-prices[i]); ? 還有一位

    2024年02月08日
    瀏覽(23)
  • 【學(xué)會動態(tài)規(guī)劃】買賣股票的最佳時機(jī)含手續(xù)費(fèi)(16)

    【學(xué)會動態(tài)規(guī)劃】買賣股票的最佳時機(jī)含手續(xù)費(fèi)(16)

    目錄 動態(tài)規(guī)劃怎么學(xué)? 1. 題目解析 2. 算法原理 1. 狀態(tài)表示 2. 狀態(tài)轉(zhuǎn)移方程 3. 初始化 4. 填表順序 5. 返回值 3. 代碼編寫 寫在最后: 學(xué)習(xí)一個算法沒有捷徑,更何況是學(xué)習(xí)動態(tài)規(guī)劃, 跟我一起刷動態(tài)規(guī)劃算法題,一起學(xué)會動態(tài)規(guī)劃! 這道題也不難理解,主要有兩個點(diǎn)需要注

    2024年02月14日
    瀏覽(32)
  • 動態(tài)規(guī)劃 Leetcode 714 買賣股票的最佳時機(jī)含手續(xù)費(fèi)

    Leetcode 714 學(xué)習(xí)記錄自代碼隨想錄 要點(diǎn):1.兩種狀態(tài)持有股票和不持有股票; 2.遞推公式 d p [ i ] [ 0 ] = m a x ( d p [ i ? 1 ] [ 0 ] , d p [ i ? 1 ] [ 1 ] ? p r i c e s [ i ] ) d p [ i ] [ 1 ] = m a x ( d p [ i ? 1 ] [ 1 ] , d p [ i ? 1 ] [ 0 ] + p r i c e s [ i ] ? f e e ) dp[i][0] = max(dp[i-1][0], dp[i-1][1]-prices

    2024年04月09日
    瀏覽(25)
  • 309. 買賣股票的最佳時機(jī)含冷凍期(leetcode) 動態(tài)規(guī)劃思想

    309. 買賣股票的最佳時機(jī)含冷凍期(leetcode) 動態(tài)規(guī)劃思想

    在本文章中,我們將要詳細(xì)介紹一下Leetcode中買賣股票的最佳時機(jī)含冷凍期相關(guān)的內(nèi)容,本題采用動態(tài)規(guī)劃的思想解決 列出dp表,dp表中值的含義是什么 ? ?dp[i]表示第i天之后此時的最大利潤 由于第i天不確定具體狀態(tài),多狀態(tài)dp問題 ? ? ?? .dp[i][0]:手中有股票沒有賣出,我

    2024年02月03日
    瀏覽(47)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包