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

動(dòng)態(tài)規(guī)劃系列 | 狀態(tài)機(jī)模型(上)| 練完這些就算入門了!

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

核心思想

用狀態(tài)機(jī)模型求解動(dòng)態(tài)規(guī)劃問題,就是將原始問題用狀態(tài)機(jī)模型進(jìn)行表示,即每個(gè)節(jié)點(diǎn)表示狀態(tài),每條邊表示一個(gè)狀態(tài)轉(zhuǎn)移,邊上的權(quán)值表示轉(zhuǎn)移的代價(jià)或收益。

狀態(tài)機(jī)模型的目標(biāo)是找到一條從初始狀態(tài)出發(fā),經(jīng)過若干次狀態(tài)轉(zhuǎn)移,達(dá)到某個(gè)終止?fàn)顟B(tài)的路徑,使得最終的結(jié)果值最大或最小。

LeetCode-198. 打家劫舍

題目描述

原題鏈接

你是一個(gè)專業(yè)的小偷,計(jì)劃偷竊沿街的房屋。每間房?jī)?nèi)都藏有一定的現(xiàn)金,影響你偷竊的唯一制約因素就是相鄰的房屋裝有相互連通的防盜系統(tǒng),如果兩間相鄰的房屋在同一晚上被小偷闖入,系統(tǒng)會(huì)自動(dòng)報(bào)警。

給定一個(gè)代表每個(gè)房屋存放金額的非負(fù)整數(shù)數(shù)組,計(jì)算你 不觸動(dòng)警報(bào)裝置的情況下 ,一夜之內(nèi)能夠偷竊到的最高金額。

問題分析

狀態(tài)定義

  • dp[i][0]:表示不偷竊第 i 家,前 i 家的最大收益。
  • dp[i][1]:表示偷竊第 i 家,前 i 家的最大收益。

狀態(tài)轉(zhuǎn)移

  • 若不偷竊第 i 家,則可以從dp[i-1][0]dp[i-1][0]轉(zhuǎn)移過來,即dp[i][0] = max(dp[i-1][0], dp[i-1][1])
  • 若偷竊第 i 家,因?yàn)椴荒芡蹈`兩間相鄰的房屋,因此dp[i][1]只能從第 i-1 家沒有被偷竊的狀態(tài)轉(zhuǎn)移過來,即dp[i][1] = dp[i-1][0] + nums[i]

對(duì)應(yīng)的狀態(tài)轉(zhuǎn)移圖如下:

動(dòng)態(tài)規(guī)劃 有限狀態(tài)機(jī),手撕算法,動(dòng)態(tài)規(guī)劃,算法,leetcode

狀態(tài)壓縮

觀察上述狀態(tài)壓縮圖,我們可以進(jìn)一步將狀態(tài)壓縮到只有兩個(gè)狀態(tài):

動(dòng)態(tài)規(guī)劃 有限狀態(tài)機(jī),手撕算法,動(dòng)態(tài)規(guī)劃,算法,leetcode

壓縮后的狀態(tài)轉(zhuǎn)移方程:

  • dp[0] = max(dp[0], dp[1])
  • dp[1] = dp[0] + nums[i]

復(fù)雜度分析

時(shí)間復(fù)雜度為: O ( n ) O(n) O(n)

空間復(fù)雜度為: O ( 1 ) O(1) O(1)

程序代碼

class Solution {
public:
    int rob(vector<int>& nums) {
        vector<int> dp(2, 0);
        dp[1] = nums[0];
        for(int i = 1; i < nums.size(); i++) {
            int t = dp[0];
            dp[0] = max(dp[0], dp[1]);
            dp[1] = t + nums[i];
        }
        return max(dp[0], dp[1]);
    }
};

LeetCode-188. 買賣股票的最佳時(shí)機(jī) Ⅳ

題目描述

原題鏈接

給你一個(gè)整數(shù)數(shù)組 prices 和一個(gè)整數(shù) k ,其中 prices[i] 是某支給定的股票在第 i 天的價(jià)格。

設(shè)計(jì)一個(gè)算法來計(jì)算你所能獲取的最大利潤(rùn)。你最多可以完成 k 筆交易。也就是說,你最多可以買 k 次,賣 k 次。

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

問題分析

我們將股票買入記為一次新的交易的開始。

狀態(tài)定義

  • dp[i][j][0]:第 i 天,正在進(jìn)行第 j 次交易,手中沒有持有股票
  • dp[i][j][1]:第 i 天,正在進(jìn)行第 j 次交易,手中持有股票

狀態(tài)轉(zhuǎn)移

  • 若第 i 天,正在進(jìn)行第 j 次交易,手中沒有持有股票,則上一天可能正在進(jìn)行第 j 次交易,且手中沒有持有股票?;蛘呱弦惶斐钟泄善?,并在第 i 天賣出,即dp[i][j][0] = max(dp[i-1][j][0], dp[i-1][j][1] + prices[i])
  • 若第 i 天,正在進(jìn)行第 j 次交易,手中持有股票,則上一天可能正在進(jìn)行第 j 次交易,且手中沒有持有股票。或者上一天不持有股票,并在第 i 天買入,即dp[i][j][1] = max(dp[i-1][j][1], dp[i-1][j-1][0] - prices[i])

狀態(tài)轉(zhuǎn)移圖

動(dòng)態(tài)規(guī)劃 有限狀態(tài)機(jī),手撕算法,動(dòng)態(tài)規(guī)劃,算法,leetcode

狀態(tài)壓縮

上述的狀態(tài)轉(zhuǎn)化圖可以進(jìn)一步壓縮:

動(dòng)態(tài)規(guī)劃 有限狀態(tài)機(jī),手撕算法,動(dòng)態(tài)規(guī)劃,算法,leetcode

壓縮后的狀態(tài)轉(zhuǎn)移方程:

  • dp[j][0] = max(dp[j][0], dp[j][1] + prices[i])
  • dp[j][1] = max(dp[j][1], dp[j-1][0] - prices[i])

復(fù)雜度分析

時(shí)間復(fù)雜度: O ( n × k ) O(n×k) O(n×k)

空間復(fù)雜度: O ( 2 × k ) O(2×k) O(2×k)

程序代碼

class Solution {
public:
    int maxProfit(int k, vector<int>& prices) {
        vector<vector<int>> dp(k+1, vector<int>(2, 0));
        
        for(int i = 1; i <= k; i++)  dp[i][1] = -prices[0];

        for(int i = 1; i < prices.size(); i++) {
            for(int j = k; j >= 1; j--) {
                dp[j][0] = max(dp[j][0], dp[j][1] + prices[i]);
                dp[j][1] = max(dp[j][1], dp[j-1][0] - prices[i]);
            }
        }

        return dp[k][0];
    }
};

LeetCode-309. 買賣股票的最佳時(shí)機(jī)含冷凍期

題目描述

給定一個(gè)整數(shù)數(shù)組prices,其中第 prices[i] 表示第 _i_ 天的股票價(jià)格 。?

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

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

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

問題分析

我們將股票買入記為一次新的交易的開始。

狀態(tài)定義

  • dp[i][0]:第 i 天,手中沒有持有股票第 1 天。
  • dp[i][1]:第 i 天,手中沒有持有股票超天數(shù)大于等于 2。
  • dp[i][2]:第 i 天,手中持有股票。

狀態(tài)轉(zhuǎn)移

  • dp[i][0] = dp[i-1][2] + prices[i]:第 i 天,手中沒有持有股票第一天,一定是第 i -1 天持有股票,并在第 i 天賣出。
  • dp[i][1] = max(dp[i-1][1], dp[i-1][0]):第 i 天,手中沒有持有股票天數(shù)大于等于 2。則上一狀態(tài)可能是不持有股票天數(shù)大于等于 2(dp[i-1][1])或第 i -1 天是不持有股票第一天(dp[i-1][0])。
  • dp[i][2] = max(dp[i-1][2], dp[i-1][1] - prices[i]):第 i 天,正在進(jìn)行第 j 次交易,手中持有股票。則上一狀態(tài)可能是持有股票(dp[i-1][2])或第 i-1 天不持有股票天數(shù)大于等于2,并在第 i 天買入股票,即dp[i-1][1] - prices[i]

狀態(tài)轉(zhuǎn)移圖

動(dòng)態(tài)規(guī)劃 有限狀態(tài)機(jī),手撕算法,動(dòng)態(tài)規(guī)劃,算法,leetcode

狀態(tài)壓縮

上述狀態(tài)機(jī)模型圖可以進(jìn)一步壓縮:

動(dòng)態(tài)規(guī)劃 有限狀態(tài)機(jī),手撕算法,動(dòng)態(tài)規(guī)劃,算法,leetcode

壓縮后的狀態(tài)轉(zhuǎn)移方程:

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

復(fù)雜度分析

時(shí)間復(fù)雜度: O ( n ) O(n) O(n)

空間復(fù)雜度: O ( 1 ) O(1) O(1)文章來源地址http://www.zghlxwxcb.cn/news/detail-835259.html

程序代碼

class Solution {
public:
    int maxProfit(vector<int>& prices) {
        int n = prices.size();
        vector<int> dp(3, 0);

        dp[2] = -prices[0];

        for(int i = 1; i < n; i++) {
            int t0 = dp[0], t1 = dp[1], t2 = dp[2];
            dp[0] = t2 + prices[i];
            dp[1] = max(t0, t1);
            dp[2] = max(t1 - prices[i], t2);
        }

        return max(dp[0], dp[1]);
    }
};

到了這里,關(guān)于動(dòng)態(tài)規(guī)劃系列 | 狀態(tài)機(jī)模型(上)| 練完這些就算入門了!的文章就介紹完了。如果您還想了解更多內(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)文章

  • 運(yùn)籌系列87:julia求解隨機(jī)動(dòng)態(tài)規(guī)劃問題入門

    運(yùn)籌系列87:julia求解隨機(jī)動(dòng)態(tài)規(guī)劃問題入門

    隨機(jī)動(dòng)態(tài)規(guī)劃問題的特點(diǎn)是: 有多個(gè)階段,每個(gè)階段的隨機(jī)性互不相關(guān),且有有限個(gè)實(shí)現(xiàn)值 (finite realizations) 具有馬爾可夫性質(zhì),即每個(gè)階段只受上一個(gè)階段影響,可以用狀態(tài)轉(zhuǎn)移方程來描述階段與階段之間的變化過程。 我們使用julia的SDDP算法包來求解隨機(jī)動(dòng)態(tài)規(guī)劃問題。

    2024年01月16日
    瀏覽(27)
  • 動(dòng)態(tài)規(guī)劃入門(數(shù)字三角形模型)

    動(dòng)態(tài)規(guī)劃入門(數(shù)字三角形模型)

    備戰(zhàn) 2024年藍(lán)橋杯算法學(xué)習(xí) -- 每日一題 Python大學(xué)A組 ????????試題一:摘花生 ????????試題二:最低通行費(fèi)用 ????????試題三:方格取數(shù) ????????試題四:傳紙條 【題目描述】 ????????Hello Kitty想摘點(diǎn)花生送給她喜歡的米老鼠。她來到一片有網(wǎng)格狀道路的矩

    2024年04月14日
    瀏覽(18)
  • 動(dòng)態(tài)規(guī)劃系列 | 最長(zhǎng)上升子序列模型(下)| 攔截導(dǎo)彈一網(wǎng)打盡!

    動(dòng)態(tài)規(guī)劃系列 | 最長(zhǎng)上升子序列模型(下)| 攔截導(dǎo)彈一網(wǎng)打盡!

    題目描述 某國(guó)為了防御敵國(guó)的導(dǎo)彈襲擊,發(fā)展出一種導(dǎo)彈攔截系統(tǒng)。 但是這種導(dǎo)彈攔截系統(tǒng)有一個(gè)缺陷:雖然它的第一發(fā)炮彈能夠到達(dá)任意的高度,但是以后每一發(fā)炮彈都不能高于前一發(fā)的高度。 某天,雷達(dá)捕捉到敵國(guó)的導(dǎo)彈來襲。 由于該系統(tǒng)還在試用階段,所以只有一套

    2024年02月03日
    瀏覽(22)
  • 第九章 動(dòng)態(tài)規(guī)劃part04(● 01背包問題,你該了解這些! ● 01背包問題,你該了解這些! 滾動(dòng)數(shù)組 ● 416. 分割等和子集 )

    第九章 動(dòng)態(tài)規(guī)劃part04(● 01背包問題,你該了解這些! ● 01背包問題,你該了解這些! 滾動(dòng)數(shù)組 ● 416. 分割等和子集 )

    ● 01背包問題,你該了解這些! ● 01背包問題,你該了解這些! 滾動(dòng)數(shù)組 ● 416. 分割等和子集 https://programmercarl.com/%E8%83%8C%E5%8C%85%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%8001%E8%83%8C%E5%8C%85-1.html 視頻講解:https://www.bilibili.com/video/BV1cg411g7Y6 1.確定dp數(shù)組以及下標(biāo)的含義 i是物品,j是背包容量

    2024年01月16日
    瀏覽(25)
  • 動(dòng)態(tài)規(guī)劃——狀態(tài)轉(zhuǎn)移方程

    動(dòng)態(tài)規(guī)劃——狀態(tài)轉(zhuǎn)移方程

    DP問題的核心即確定動(dòng)態(tài)轉(zhuǎn)移方程。 (1)尋找變量,確定子問題。DP表一般為二維,故需要兩個(gè)變量。 (2)尋找總問題與子問題迭代關(guān)系,確定中間值、迭代值 例1: 有5個(gè)物品,其重量分別是{2, 2, 6, 5, 4},價(jià)值分別為{6, 3, 5, 4, 6},背包的容量為10,計(jì)算背包所能裝入物品的

    2023年04月08日
    瀏覽(26)
  • 動(dòng)態(tài)規(guī)劃之簡(jiǎn)單多狀態(tài)

    動(dòng)態(tài)規(guī)劃之簡(jiǎn)單多狀態(tài)

    1.題目鏈接:按摩師 2.題目描述:一個(gè)有名的按摩師會(huì)收到源源不斷的預(yù)約請(qǐng)求,每個(gè)預(yù)約都可以選擇接或不接。在每次預(yù)約服務(wù)之間要有休息時(shí)間,因此她不能接受相鄰的預(yù)約。給定一個(gè)預(yù)約請(qǐng)求序列,替按摩師找到最優(yōu)的預(yù)約集合(總預(yù)約時(shí)間最長(zhǎng)),返回總的分鐘數(shù)。

    2024年02月09日
    瀏覽(20)
  • 【動(dòng)態(tài)規(guī)劃】簡(jiǎn)單多狀態(tài)

    【動(dòng)態(tài)規(guī)劃】簡(jiǎn)單多狀態(tài)

    題目鏈接 狀態(tài)表示 dp[i] 表示到i位置的時(shí)候預(yù)約的最大時(shí)長(zhǎng)。但是這個(gè)題目我們可以選擇接或不接。因此可以繼續(xù)劃分為兩個(gè)子狀態(tài): f[i] 表示:到i位置時(shí)接受的最大時(shí)長(zhǎng) g[i] 表示:到i位置時(shí)不接受的最大時(shí)長(zhǎng) 狀態(tài)轉(zhuǎn)移方程 初始化 因?yàn)檫@個(gè)題目比較簡(jiǎn)單,所以不需要使用

    2024年02月15日
    瀏覽(23)
  • Day42|動(dòng)態(tài)規(guī)劃part04: 01背包問題,你該了解這些!、滾動(dòng)數(shù)組、416. 分割等和子集

    Day42|動(dòng)態(tài)規(guī)劃part04: 01背包問題,你該了解這些!、滾動(dòng)數(shù)組、416. 分割等和子集

    其他背包,面試幾乎不會(huì)問,都是競(jìng)賽級(jí)別的了,leetcode上連多重背包的題目都沒有,所以題庫(kù)也告訴我們,01背包和完全背包就夠用了。 而完全背包又是也是01背包稍作變化而來,即:完全背包的物品數(shù)量是無限的。 01 背包問題描述 有n件物品和一個(gè)最多能背重量為w 的背包

    2024年04月25日
    瀏覽(17)
  • 【算法學(xué)習(xí)】簡(jiǎn)單多狀態(tài)-動(dòng)態(tài)規(guī)劃

    【算法學(xué)習(xí)】簡(jiǎn)單多狀態(tài)-動(dòng)態(tài)規(guī)劃

    ? ? ? ? 本篇博客記錄動(dòng)態(tài)規(guī)劃中的簡(jiǎn)單多狀態(tài)問題。 ? ? ? ? 在之前的動(dòng)態(tài)規(guī)劃類型的題中,我們每次分析的都只是一種或者某一類的狀態(tài),定義的dp表也是圍繞著一種狀態(tài)來的。 ? ? ? ? 現(xiàn)在可能對(duì)于一種狀態(tài),存在幾種不同的子狀態(tài),在狀態(tài)轉(zhuǎn)移過程中相互影響。此時(shí)

    2024年01月18日
    瀏覽(25)
  • 多狀態(tài)動(dòng)態(tài)規(guī)劃之按摩師

    多狀態(tài)動(dòng)態(tài)規(guī)劃之按摩師

    題目鏈接選自力扣 : 面試題 17.16. 按摩師 還是一樣, 根據(jù)給的示例 1 來分析看看 : 進(jìn)過分析, 一共有這樣幾個(gè)規(guī)定 : 相鄰預(yù)約不能同時(shí)接受 可以從任意一個(gè)預(yù)約開始 不能之前的 最終總的預(yù)約時(shí)長(zhǎng)要最長(zhǎng)的 以 i 位置為結(jié)尾, 表示從某一個(gè)位置預(yù)約開始到 i 位置結(jié)束時(shí)的預(yù)約最長(zhǎng)

    2024年02月11日
    瀏覽(18)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包