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

算法訓(xùn)練day49|動(dòng)態(tài)規(guī)劃part10

這篇具有很好參考價(jià)值的文章主要介紹了算法訓(xùn)練day49|動(dòng)態(tài)規(guī)劃part10。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

121. 買賣股票的最佳時(shí)機(jī) 參考文章:代碼隨想錄

貪心

因?yàn)楣善本唾I賣一次,那么貪心的想法很自然就是取最左最小值,取最右最大值,那么得到的差值就是最大利潤。

本次重點(diǎn)學(xué)習(xí)動(dòng)態(tài)規(guī)劃方法

1. dp數(shù)組(dp table)以及下標(biāo)的含義

dp[i][0] 表示第i天持有股票所得最多現(xiàn)金,一開始現(xiàn)金為負(fù)數(shù),所以第一天就持有股票的話,就是為負(fù)

dp[i][1] 表示第i天不持有股票所得最多現(xiàn)金

如果按照買入,賣出來分別狀態(tài),那什么都不干的狀態(tài)并不能涵蓋

所以應(yīng)該按照持有,和不持有來區(qū)分

持有包含今天買入和之前買入但是這幾天一直沒變動(dòng)

不持有包含今天賣出,和之前賣出之后沒變動(dòng)

這兩種狀態(tài)能夠涵蓋所有情況

2. 遞推公式

如果第i天持有股票即dp[i][0], 那么可以由兩個(gè)狀態(tài)推出來

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

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

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

  • 第i-1天就不持有股票,那么就保持現(xiàn)狀,所得現(xiàn)金就是昨天不持有股票的所得現(xiàn)金 即:dp[i - 1][1]
  • i天賣出股票,所得現(xiàn)金就是按照今天股票價(jià)格賣出后所得現(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]);

3.初始化

由遞推公式 dp[i][0] = max(dp[i - 1][0], -prices[i]); 和 dp[i][1] = max(dp[i - 1][1], prices[i] + dp[i - 1][0]);可以看出

其基礎(chǔ)都是要從dp[0][0]和dp[0][1]推導(dǎo)出來,而且在遞推過程中只參考前一位,所以有壓縮的可能性

那么dp[0][0]表示第0天持有股票,此時(shí)的持有股票就一定是買入股票了,因?yàn)椴豢赡苡星耙惶焱瞥鰜?,所以dp[0][0] -= prices[0];

dp[0][1]表示第0天不持有股票,不持有股票那么現(xiàn)金就是0,所以dp[0][1] = 0;

4.根據(jù)遞推公式,dp[i]都是由dp[i - 1]推導(dǎo)出來的,那么一定是從前向后遍歷

// 解法1
class Solution {
    public int maxProfit(int[] prices) {
        if (prices == null || prices.length == 0) return 0;
        int length = prices.length;
        // dp[i][0]代表第i天持有股票的最大收益
        // dp[i][1]代表第i天不持有股票的最大收益
        int[][] dp = new int[length][2];
        int result = 0;
        dp[0][0] = -prices[0];
        dp[0][1] = 0;
        for (int i = 1; i < length; i++) {
            dp[i][0] = Math.max(dp[i - 1][0], -prices[i]);
            dp[i][1] = Math.max(dp[i - 1][0] + prices[i], dp[i - 1][1]);
        }
        return dp[length - 1][1];
    }
}

優(yōu)化:由于遞推公式更新時(shí),只需要參考前一位的數(shù)值,所以我們可以將空間壓縮為2,滾動(dòng)更新數(shù)組

class Solution {
    public int maxProfit(int[] prices) {
        int len = prices.length;
        int dp[][] = new int[2][2];
        
        dp[0][0] = - prices[0];
        dp[0][1] = 0;

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

122.買賣股票的最佳時(shí)機(jī)II

與上題區(qū)別:可以買賣多次股票,但是只能持有一個(gè)

只有遞歸公式有區(qū)別

如果第i天持有股票即dp[i][0], 那么可以由兩個(gè)狀態(tài)推出來

  • i-1天就持有股票,那么就保持現(xiàn)狀,所得現(xiàn)金就是昨天持有股票的所得現(xiàn)金 即:dp[i - 1][0]
  • i天買入股票,所得現(xiàn)金就是前一天不持有股票的現(xiàn)金,再減去買入今天的股票后花費(fèi)的現(xiàn)金即:的 dp[i-1][1]-prices[i]

其他均與上題相同

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len = prices.size();
        vector<vector<int>> dp(len, vector<int>(2, 0));
        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]); // 注意這里是和121. 買賣股票的最佳時(shí)機(jī)唯一不同的地方。
            dp[i][1] = max(dp[i - 1][1], dp[i - 1][0] + prices[i]);
        }
        return dp[len - 1][1];
    }
};

由于只需要用到dp[i-1][0],dp[i-1][1]來推導(dǎo)dp[i][0],dp[i][1]

我們可以把dp數(shù)組壓縮到 2x2的數(shù)組,滾動(dòng)更新

// 版本二
class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int len = prices.size();
        vector<vector<int>> dp(2, vector<int>(2)); // 注意這里只開辟了一個(gè)2 * 2大小的二維數(shù)組
        dp[0][0] -= prices[0];
        dp[0][1] = 0;
        for (int i = 1; i < len; i++) {
            dp[i % 2][0] = max(dp[(i - 1) % 2][0], dp[(i - 1) % 2][1] - prices[i]);
            dp[i % 2][1] = max(dp[(i - 1) % 2][1], prices[i] + dp[(i - 1) % 2][0]);
        }
        return dp[(len - 1) % 2][1];
    }
};

本題也可以用貪心方法文章來源地址http://www.zghlxwxcb.cn/news/detail-767850.html

 // 貪心思路
class Solution {
     public int maxProfit(int[] prices) {
         int result = 0;
         for (int i = 1; i < prices.length; i++) {
             result += Math.max(prices[i] - prices[i - 1], 0);
         }
         return result;
     }
 }

到了這里,關(guān)于算法訓(xùn)練day49|動(dòng)態(tài)規(guī)劃part10的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • day49-動(dòng)態(tài)規(guī)劃10-買賣股票問題

    但是利用其他思路只能解決具體場(chǎng)景下的問題,并不能解決通用的一些問題。 dp[i][0] :表示第i天持有該股票的最大收益, dp[i][1] 表示第i天不持有該股票的最大收益。需要注意的是第i天的情況是什么樣,并不是表示第i天就賣出了這只股票,而是表示 遞推公式: dp[i][0] 第一

    2024年02月08日
    瀏覽(17)
  • day44代碼訓(xùn)練|動(dòng)態(tài)規(guī)劃part06

    day44代碼訓(xùn)練|動(dòng)態(tài)規(guī)劃part06

    完全背包和01背包問題唯一不同的地方就是,每種物品有無限件 。 1. dp數(shù)組的含義 dp[i][j] 0-i物品,重量為j的容量時(shí),最大的價(jià)值 2. 遞推公式 dp[i][j] = max(dp[i-1][j],dp[i][j-weight[i]]+value[i]); 兩種狀態(tài),不用物品i的話,直接是用dp[i-1][j] 選用物品的話,為了重復(fù)使用物品i,其實(shí)是

    2024年02月03日
    瀏覽(23)
  • 【代碼隨想錄】Day 49 動(dòng)態(tài)規(guī)劃10 (買賣股票Ⅰ、Ⅱ)

    【代碼隨想錄】Day 49 動(dòng)態(tài)規(guī)劃10 (買賣股票Ⅰ、Ⅱ)

    https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/ dp[i]表示在第i天時(shí),賣/不賣股票能獲得的最大利潤: 1、賣股票:dp[i] = prices[i] -minPrice(i天以前的最低價(jià)格) 2、不賣股票:dp[i] = dp[i-1](因?yàn)椴毁u股票,所以狀態(tài)和前一天保持一致) ∴dp[i] = max(dp[i-1], prices[i] - minPrice); https

    2024年02月09日
    瀏覽(18)
  • 代碼隨想錄算法訓(xùn)練51 | 動(dòng)態(tài)規(guī)劃part12

    本題加了一個(gè)冷凍期,狀態(tài)就多了,有點(diǎn)難度,大家要把各個(gè)狀態(tài)分清,思路才能清晰? 視頻講解: 動(dòng)態(tài)規(guī)劃來決定最佳時(shí)機(jī),這次有冷凍期!| LeetCode:309.買賣股票的最佳時(shí)機(jī)含冷凍期_嗶哩嗶哩_bilibili 代碼隨想錄 相對(duì)122.買賣股票的最佳時(shí)機(jī)II?,本題只需要在計(jì)算賣出操

    2024年01月18日
    瀏覽(51)
  • 算法打卡day49|動(dòng)態(tài)規(guī)劃篇17| Leetcode 647. 回文子串、516.最長(zhǎng)回文子序列

    算法打卡day49|動(dòng)態(tài)規(guī)劃篇17| Leetcode 647. 回文子串、516.最長(zhǎng)回文子序列

    Leetcode 647. 回文子串 題目鏈接:647. 回文子串 大佬視頻講解:647. 回文子串視頻講解 ?個(gè)人思路? 這道題的dp數(shù)組有點(diǎn)難找到關(guān)聯(lián),以至于遞歸關(guān)系也不好找,所以看題解吧... 解法 動(dòng)態(tài)規(guī)劃 動(dòng)規(guī)五部曲: 1.確定dp數(shù)組(dp table)以及下標(biāo)的含義 一般在定義dp數(shù)組的時(shí)候 會(huì)根據(jù)題

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

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

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

    2024年03月15日
    瀏覽(33)
  • java算法day45 | 動(dòng)態(tài)規(guī)劃part07 ● 70. 爬樓梯 (進(jìn)階) ● 322. 零錢兌換 ● 279.完全平方數(shù)

    java算法day45 | 動(dòng)態(tài)規(guī)劃part07 ● 70. 爬樓梯 (進(jìn)階) ● 322. 零錢兌換 ● 279.完全平方數(shù)

    題目描述: 假設(shè)你正在爬樓梯。需要 n 階你才能到達(dá)樓頂。 每次你可以爬至多m (1 = m n)個(gè)臺(tái)階。你有多少種不同的方法可以爬到樓頂呢? 注意:給定 n 是一個(gè)正整數(shù)。 輸入描述:輸入共一行,包含兩個(gè)正整數(shù),分別表示n, m 輸出描述:輸出一個(gè)整數(shù),表示爬到樓頂?shù)姆椒〝?shù)

    2024年04月14日
    瀏覽(28)
  • 算法訓(xùn)練Day39:62.不同路徑 63. 不同路徑 II 動(dòng)態(tài)規(guī)劃

    算法訓(xùn)練Day39:62.不同路徑 63. 不同路徑 II 動(dòng)態(tài)規(guī)劃

    Category Difficulty Likes Dislikes ContestSlug ProblemIndex Score algorithms Medium (67.70%) 1746 0 - - 0 Tags Companies 一個(gè)機(jī)器人位于一個(gè) m x n 網(wǎng)格的左上角 (起始點(diǎn)在下圖中標(biāo)記為 “Start” )。 機(jī)器人每次只能向下或者向右移動(dòng)一步。機(jī)器人試圖達(dá)到網(wǎng)格的右下角(在下圖中標(biāo)記為 “Finish” )。

    2023年04月25日
    瀏覽(22)
  • 算法基礎(chǔ)復(fù)盤筆記Day10【動(dòng)態(tài)規(guī)劃】—— 線性DP

    算法基礎(chǔ)復(fù)盤筆記Day10【動(dòng)態(tài)規(guī)劃】—— 線性DP

    ? 作者主頁:歡迎來到我的技術(shù)博客?? ? 個(gè)人介紹:大家好,本人熱衷于 Java后端開發(fā) ,歡迎來交流學(xué)習(xí)哦!( ̄▽ ̄)~* ?? 如果文章對(duì)您有幫助,記得 關(guān)注 、 點(diǎn)贊 、 收藏 、 評(píng)論 ?????? ?? 您的支持將是我創(chuàng)作的動(dòng)力,讓我們一起加油進(jìn)步吧?。?!???? 1. 題目

    2023年04月21日
    瀏覽(32)
  • Day46- 動(dòng)態(tài)規(guī)劃part14

    題目一:1143. 最長(zhǎng)公共子序列 1143. 最長(zhǎng)公共子序列 給定兩個(gè)字符串? text1 ?和? text2 ,返回這兩個(gè)字符串的最長(zhǎng)? 公共子序列 ?的長(zhǎng)度。如果不存在? 公共子序列 ?,返回? 0 ?。 一個(gè)字符串的? 子序列 ? 是指這樣一個(gè)新的字符串:它是由原字符串在不改變字符的相對(duì)順序的

    2024年02月21日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包