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

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

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

買賣股票有一系列題目

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

以下是我找出它們之間的區(qū)別:

第一題,只能買一次,從最低價入手,最高價賣出

第二題,可以買無數(shù)次,但買了之后,必須賣出之后,再來重新買入,再賣出。

第三題,只能買兩次,但買了之后,必須賣出之后,再來重新買入,再賣出。

第四題,,只能買k次,k為既定數(shù)值,但買了之后,必須賣出之后,再來重新買入,再賣出。

第五題,可以買無數(shù)次,但在完成一次交易之后,存在一天的冷凍期,交易狀態(tài)為: [買入, 賣出, 冷凍期, 買入, 賣出]。

第六題,可以買無數(shù)次,但一次交易存在手續(xù)費,在交易完成一次之后需要付出一定的手續(xù)費。

其中第一題可以說是后面題目的基礎,

第一題

給定一個數(shù)組 prices ,它的第?i 個元素?prices[i] 表示一支給定股票第 i 天的價格。

你只能選擇 某一天 買入這只股票,并選擇在 未來的某一個不同的日子 賣出該股票。設計一個算法來計算你所能獲取的最大利潤。

返回你可以從這筆交易中獲取的最大利潤。如果你不能獲取任何利潤,返回 0 。

  • 示例 1:

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

  • 輸出:5
    解釋:在第 2 天(股票價格 = 1)的時候買入,在第 5 天(股票價格 = 6)的時候賣出,最大利潤 = 6-1 = 5 。注意利潤不能是 7-1 = 6, 因為賣出價格需要大于買入價格;同時,你不能在買入前賣出股票。

  • 示例 2:

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

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

這個題目通過暴力來做是最簡單通俗的,但咱們需要學習動態(tài)規(guī)劃的思想,

于是來說說動態(tài)規(guī)劃的做法,

第一步——遞推的思路

很顯然我們可以通過比較大小,來遍歷數(shù)組中的數(shù),然后留下最小的,然后再來遍歷最小后面最大的數(shù),找出最大的差值,這就是我們要輸出的dp;

第二步——確定遞推公式

定義一個兩列n行的數(shù)組存放,

然后dp[i][0]

  • 第i-1天就持有股票,那么就保持現(xiàn)狀,所得現(xiàn)金就是昨天持有股票的所得現(xiàn)金 即:dp[i - 1][0]
  • 第i天買入股票,所得現(xiàn)金就是買入今天的股票后所得現(xiàn)金即:-prices[i]

那么dp[i][0]應該選所得現(xiàn)金最大的,所以dp[i][0] = max(dp[i - 1][0], -prices[i]);

dp[i][1]

如果第i天不持有股票即dp[i][1], 也可以由兩個狀態(tài)推出來

  • 第i-1天就不持有股票,那么就保持現(xiàn)狀,所得現(xiàn)金就是昨天不持有股票的所得現(xiàn)金 即:dp[i - 1][1]
  • 第i天賣出股票,所得現(xiàn)金就是按照今天股票價格賣出后所得現(xiàn)金即:prices[i] + dp[i - 1][0]

同樣dp[i][1]取最大的,dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);

所以能得到:

 for (int i = 1; i < len; i++) {
            dp[i][0] = max(dp[i - 1][0], -prices[i]);
            dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);
        }

然后進行初始化,

dp[0][0]=-price[0];

dp[0][1]=0;

第三步——確定遍歷順序

此題只需要一層循環(huán),所以就用那個就行。

代碼展示:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len=prices.size();
        if(len==0) return 0;
        vector<vector<int>>dp(len,vector<int>(2,0));//定義數(shù)組
        dp[0][0]-=prices[0];//初始化
        dp[0][1]=0;
        for(int i=1;i<len;i++){
            dp[i][0]=max(dp[i-1][0],-prices[i]);
            dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]);//遍歷
        }
        return dp[len-1][1];

    }
};

第四步——舉例

以示例1,輸入:[7,1,5,3,6,4]為例,dp數(shù)組狀態(tài)如下:

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

另外買賣股票的最佳時機II買賣股票的最佳時機含手續(xù)費這兩個題目和此題是非常相似的

給出代碼先

買賣股票的最佳時機II:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len=prices.size();
        if(len==0) return 0;
        vector<vector<int>>dp(len,vector<int>(2,0));//定義數(shù)組
        dp[0][0]-=prices[0];//初始化
        dp[0][1]=0;
        for(int i=1;i<len;i++){
            dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]);//和Ⅰ相比只有此處不同
            dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]);//遍歷
        }
        return dp[len-1][1];

    }
};

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

我來解釋一下這個,就是在進行一次交易賺到利益之后,把利益的值減去又再次投入的值,進行了一個投入累加。

買賣股票的最佳時機含手續(xù)費:

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len=prices.size();
        if(len==0) return 0;
        vector<vector<int>>dp(len,vector<int>(2,0));//定義數(shù)組
        dp[0][0]-=prices[0];//初始化
        dp[0][1]=0;
        for(int i=1;i<len;i++){
            dp[i][0]=max(dp[i-1][0],dp[i-1][1]-prices[i]);
            dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]-fee);//和Ⅱ相比只有此處不同
        }
        return dp[len-1][1];

    }
};

?dp[i][1]=max(dp[i-1][1],dp[i-1][0]+prices[i]-fee);

即每次交易完成后減去交易費fee,所以只用在Ⅱ的基礎上進行一個相減即可。

三四五題是一個類型的,我放到下次來講。文章來源地址http://www.zghlxwxcb.cn/news/detail-798302.html

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

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

領(lǐng)支付寶紅包贊助服務器費用

相關(guān)文章

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

    LeetCode:121.買賣股票的最佳時機——動態(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——買賣股票的最佳時機、買賣股票的最佳時機II

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

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

    2024年03月15日
    瀏覽(33)
  • 【學會動態(tài)規(guī)劃】買賣股票的最佳時機 IV(18)

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

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

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

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

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

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

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

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

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

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

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

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

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

    狀態(tài)分類: f[i,j,0]考慮前i只股票,進行了j筆交易,目前未持有股票 所能獲得最大利潤 f[i,j,1]考慮前i只股票,進行了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)
  • 【學會動態(tài)規(guī)劃】買賣股票的最佳時機含手續(xù)費(16)

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

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

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

    Leetcode 714 學習記錄自代碼隨想錄 要點: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. 買賣股票的最佳時機含冷凍期(leetcode) 動態(tài)規(guī)劃思想

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

    在本文章中,我們將要詳細介紹一下Leetcode中買賣股票的最佳時機含冷凍期相關(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)紅包