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

【Day43】代碼隨想錄之動(dòng)態(tài)規(guī)劃0-1背包_1049. 最后一塊石頭的重量 II_494. 目標(biāo)和_ 474.一和零

這篇具有很好參考價(jià)值的文章主要介紹了【Day43】代碼隨想錄之動(dòng)態(tài)規(guī)劃0-1背包_1049. 最后一塊石頭的重量 II_494. 目標(biāo)和_ 474.一和零。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

動(dòng)態(tài)規(guī)劃理論基礎(chǔ)

動(dòng)規(guī)五部曲:
  1. 確定dp數(shù)組 下標(biāo)及dp[i] 的含義。
  2. 遞推公式:比如斐波那契數(shù)列 dp[i] = dp[i-1] + dp[i-2]。
  3. 初始化dp數(shù)組。
  4. 確定遍歷順序:從前到后or其他。
  5. 打印。
出現(xiàn)結(jié)果不正確:
  1. 打印dp日志和自己想的一樣:遞推公式、初始化或者遍歷順序出錯(cuò)。
  2. 打印dp日志和自己想的不一樣:代碼實(shí)現(xiàn)細(xì)節(jié)出現(xiàn)問題。

1049. 最后一塊石頭的重量 II

參考文檔:代碼隨想錄

題目:

有一堆石頭,每塊石頭的重量都是正整數(shù)。
每一回合,從中選出任意兩塊石頭,然后將它們一起粉碎。假設(shè)石頭的重量分別為 x 和 y,且 x <= y。那么粉碎的可能結(jié)果如下:
如果 x == y,那么兩塊石頭都會(huì)被完全粉碎;
如果 x != y,那么重量為 x 的石頭將會(huì)完全粉碎,而重量為 y 的石頭新重量為 y-x。
最后,最多只會(huì)剩下一塊石頭。返回此石頭最小的可能重量。如果沒有石頭剩下,就返回 0。

  • 示例:
    輸入:[2,7,4,1,8,1]
    輸出:1
    解釋:
    組合 2 和 4,得到 2,所以數(shù)組轉(zhuǎn)化為 [2,7,1,8,1],
    組合 7 和 8,得到 1,所以數(shù)組轉(zhuǎn)化為 [2,1,1,1],
    組合 2 和 1,得到 1,所以數(shù)組轉(zhuǎn)化為 [1,1,1],
    組合 1 和 1,得到 0,所以數(shù)組轉(zhuǎn)化為 [1],這就是最優(yōu)值。
  • 提示:
    1 <= stones.length <= 30
    1 <= stones[i] <= 1000

分析:
剛開始解題出現(xiàn)了誤區(qū),對(duì)stone從小到大的排列,偶數(shù)相鄰元素之間抵消成新的值,奇數(shù)最大和最小抵消形成新的值后轉(zhuǎn)為偶數(shù)的計(jì)算。一輪計(jì)算之后重復(fù)計(jì)算直到集合只剩一個(gè)元素。這個(gè)思路是重復(fù)的排列和相鄰的抵消。這就不屬于動(dòng)態(tài)規(guī)劃了,在動(dòng)態(tài)規(guī)劃中,將整個(gè)集合抽象為兩個(gè)集合,集合1是抵消的集合,集合2是被抵消的集合。集合1-集合2就是最后的結(jié)果,要想(集合1-集合2)最小,就要使兩個(gè)集合最接近,這就想到結(jié)合的和 sum/2,集合中是否存在子集和是最接近 sum/2 的,這個(gè)子集和就是所求的集合2。問題轉(zhuǎn)為13.分割子集和的問題。

代碼:文章來源地址http://www.zghlxwxcb.cn/news/detail-835196.html

class Solution {
public:
    int lastStoneWeightII(vector<int>& stones) {
        int sum = 0, target = 0;
        for(int i = 0; i < stones.size(); i++){
            sum += stones[i];
        }
        target = sum/2;

        vector<int> dp(target+1, 0);

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

        sum = sum - dp[target] - dp[target];
        return sum;
    }
};

494. 目標(biāo)和

參考文檔:代碼隨想錄

分析:
正整數(shù)集合分成兩個(gè)正整數(shù)的集合,left與right,一個(gè)是正數(shù),一個(gè)是即將加負(fù)號(hào)的負(fù)數(shù)。有l(wèi)eft-right=target; left + right = sum; 推出left = (target+sum)/2; 所有只要找到總集合中相加為left的方法個(gè)數(shù)就可以得到答案。問題轉(zhuǎn)為集合劃分為子集和,求實(shí)現(xiàn)子集和的方法數(shù)。所以是組合問題,遞推公式為dp[i] = dp[i] + dp[i-nums[i]]; dp[i]表示實(shí)現(xiàn)i原來的方法數(shù),dp[i-nums[i]]表示不加nums[i]的最多方法數(shù),這個(gè)集合加入nums[i]就會(huì)得到 i。初始化時(shí)候的dp[0]應(yīng)該設(shè)為1,這樣不會(huì)導(dǎo)致之后的相加一直是0,可以理解為集合和為0有一種方法就是全部都為0。其余位置的初始化為0。

代碼:

class Solution {
public:
    int findTargetSumWays(vector<int>& nums, int target) {
        //分析:兩個(gè)正數(shù)集合left、right,left-right=target,left+right=sum,left=(sum+target)/2
        //接下來計(jì)算到left的集合的方法數(shù),另一個(gè)就是right
        //dp[i]含義:集合和為i的方法個(gè)數(shù)
        //遞推公式:dp[i] = dp[i] + dp[i-nums[i]];
        //初始化:dp[0] = 1,其余為0
        //遍歷順序:0-1背包
        int sum = 0, left = 0;
        for(int i = 0; i < nums.size(); i++){
            sum += nums[i];
        }
        if((sum+target)%2 == 1) return 0;
        if((sum + target) < 0) return 0;
        left = (sum+target) / 2;
        //初始化
        vector<int> dp(left+1, 0);
        dp[0] = 1;

        for(int i = 0; i < nums.size(); i++){
            for(int j = left; j >= nums[i]; j--){
                dp[j] = dp[j] + dp[j-nums[i]];
            }
        } 
        return dp[left];
    }
};

474.一和零

參考文檔:代碼隨想錄

分析:
dp[i][j]含義是i個(gè)0,j個(gè)1的集合中最大的字符串個(gè)數(shù)。

進(jìn)而遞推公式是dp[i][j] = max(dp[i][j], dp[i-zeroNum][j-oneNum]+1); 所以本題和0-1背包的滾動(dòng)數(shù)組是類似的,只不過在是否放入背包的條件中不僅有0的限制還有1的限制,這表明在背包的循環(huán)體中處理的背包由一維上升到了二維。

遍歷順序上,必須先物品再背包,在物品的循環(huán)體中需要計(jì)算出該物品中0的個(gè)數(shù)和1的個(gè)數(shù),在背包中,需要判斷該不該把這個(gè)物品放入容量為i個(gè)0,j個(gè)1的背包中。在背包的遍歷順序中,應(yīng)該和滾動(dòng)數(shù)組的行為保持一致,需要倒序。

初始化中,有一點(diǎn)干擾到了我,我將0-1背包的二維初始化和這個(gè)背包的二維初始化聯(lián)系起來,所以思考怎么初始化行、初始化列,但是這個(gè)聯(lián)系就是錯(cuò)誤的,dp[i][j]的含義是i個(gè)0,j個(gè)1的背包可以容納的最多個(gè)數(shù)的字符串個(gè)數(shù),所以dp數(shù)組中每個(gè)位置的初始化應(yīng)該由之后背包的遍歷中確定,剛開始的初始化和滾動(dòng)數(shù)組的初始化一直,全部設(shè)為0。

代碼:

class Solution {
public:
    int findMaxForm(vector<string>& strs, int m, int n) {
        //題目分析為有兩個(gè)維度的背包,一個(gè)是m,另一個(gè)是n
        //dp[i][j]:有i個(gè)0,j個(gè)1的集合的最大長(zhǎng)度。(?。。。?/span>
        //遞推公式:dp[i][j] = max(dp[i][j], dp[i-zeroNum][j-oneNum]+1);
        //初始化:全0
        //遍歷順序:先物品再背包,因?yàn)橄任锲沸枰?jì)算出二進(jìn)制字符串中0和1的個(gè)數(shù)
        int zeroNum = 0, oneNum = 0;
        vector<vector<int>> dp(m+1, vector<int>(n+1,0));

        for(int i = 0; i < strs.size(); i++){
            zeroNum = 0, oneNum = 0;
            for(char c : strs[i]){
                if(c == '0') zeroNum++;
                else oneNum++;
            }
            for(int j = m; j >= zeroNum; j--){
                for(int k = n; k >= oneNum; k--){
                    dp[j][k] = max(dp[j][k], dp[j-zeroNum][k-oneNum]+1);
                }
            }
        }
        return dp[m][n];
    }
};

到了這里,關(guān)于【Day43】代碼隨想錄之動(dòng)態(tài)規(guī)劃0-1背包_1049. 最后一塊石頭的重量 II_494. 目標(biāo)和_ 474.一和零的文章就介紹完了。如果您還想了解更多內(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)文章

  • 二刷代碼隨想錄——?jiǎng)討B(tài)規(guī)劃day40

    一個(gè)本碩雙非的小菜雞,備戰(zhàn)24年秋招,計(jì)劃二刷完卡子哥的刷題計(jì)劃,加油! 二刷決定精刷了,于是參加了卡子哥的刷題班,訓(xùn)練營(yíng)為期60天,我一定能堅(jiān)持下去,迎來兩個(gè)月后的脫變的,加油! 推薦一手卡子哥的刷題網(wǎng)站,感謝卡子哥。代碼隨想錄 終于來到了守關(guān)boss。

    2024年03月11日
    瀏覽(85)
  • 代碼隨想錄Day41:動(dòng)態(tài)規(guī)劃Part3

    代碼隨想錄Day41:動(dòng)態(tài)規(guī)劃Part3

    講解前: 毫無頭緒 講解后: 這道題的動(dòng)態(tài)思路一開始很不容易想出來,雖然dp數(shù)組的定義如果知道是動(dòng)態(tài)規(guī)劃的話估摸著可以想出來那就是很straight forward dp定義:一維數(shù)組dp[i], i 代表整數(shù)的值,dp[i] 代表將整數(shù) i 拆分的話可以獲得的最大乘積 然后呢就是定義遞歸推導(dǎo)式了,

    2024年04月27日
    瀏覽(27)
  • 代碼隨想錄第44天|動(dòng)態(tài)規(guī)劃:完全背包理論基礎(chǔ) 518.零錢兌換II 377. 組合總和 Ⅳ

    代碼隨想錄第44天|動(dòng)態(tài)規(guī)劃:完全背包理論基礎(chǔ) 518.零錢兌換II 377. 組合總和 Ⅳ

    代碼隨想錄 (programmercarl.com) 動(dòng)態(tài)規(guī)劃之完全背包,裝滿背包有多少種方法?組合與排列有講究!| LeetCode:518.零錢兌換II_嗶哩嗶哩_bilibili 完全背包和01背包問題唯一不同的地方就是,每種物品有無限件 。 完全背包中的物品可以添加多次,所以要從小到大遍歷: 518. 零錢兌換

    2024年04月25日
    瀏覽(26)
  • 代碼隨想錄 day38 第九章 動(dòng)態(tài)規(guī)劃part01

    ●??理論基礎(chǔ) ●??509.?斐波那契數(shù) ●??70.?爬樓梯 ●??746.?使用最小花費(fèi)爬樓梯 理論基礎(chǔ) 解決動(dòng)態(tài)規(guī)劃必須要想清楚的點(diǎn) dp數(shù)組以及下標(biāo)的含義 遞推公式 dp數(shù)組如何初始化 遍歷順序 打印數(shù)組 檢查結(jié)果 關(guān)聯(lián) leetcode 509.?斐波那契數(shù) 思路 動(dòng)規(guī)五部曲 dp數(shù)組以及下標(biāo)的含義

    2024年04月17日
    瀏覽(30)
  • 【代碼隨想錄】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í),賣/不賣股票能獲得的最大利潤(rùn): 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)
  • 【Day52】代碼隨想錄之動(dòng)態(tài)規(guī)劃_打家劫舍

    動(dòng)態(tài)規(guī)劃理論基礎(chǔ) 動(dòng)規(guī)五部曲: 確定dp數(shù)組 下標(biāo)及dp[i] 的含義。 遞推公式:比如斐波那契數(shù)列 dp[i] = dp[i-1] + dp[i-2]。 初始化dp數(shù)組。 確定遍歷順序:從前到后or其他。 打印。 出現(xiàn)結(jié)果不正確: 打印dp日志和自己想的一樣:遞推公式、初始化或者遍歷順序出錯(cuò)。 打印dp日志和

    2024年02月22日
    瀏覽(28)
  • 【代碼隨想錄】刷題筆記Day43

    【代碼隨想錄】刷題筆記Day43

    剛過完非常愉快的元旦假期,唔想反工啊啊啊,先刷刷題找回學(xué)習(xí)的狀態(tài)吧 dp[target] == target為目標(biāo),weight和value相同的01背包問題,用一維遍歷 dp[j]為容量為j的背包所能裝的最大價(jià)值 dp[j] = max(dp[j], dp[j - num[i]] + nums[i]) 關(guān)鍵在于把兩兩相減問題轉(zhuǎn)化為兩堆近似相減,和上一題就

    2024年02月03日
    瀏覽(31)
  • 【隨想錄學(xué)習(xí)】——第十章 動(dòng)態(tài)規(guī)劃(0-1背包+完全背包)

    【隨想錄學(xué)習(xí)】——第十章 動(dòng)態(tài)規(guī)劃(0-1背包+完全背包)

    動(dòng)態(tài)規(guī)劃,英文:Dynamic Programming,簡(jiǎn)稱DP,如果某一問題有很多重疊子問題,使用動(dòng)態(tài)規(guī)劃是最有效的。 所以動(dòng)態(tài)規(guī)劃中每一個(gè)狀態(tài)一定是由上一個(gè)狀態(tài)推導(dǎo)出來的, 這一點(diǎn)就區(qū)分于貪心 ,貪心沒有狀態(tài)推導(dǎo),而是從局部直接選最優(yōu)的, dp數(shù)組表示斐波那契數(shù)列,dp[i]表示

    2024年01月19日
    瀏覽(29)
  • 代碼隨想錄day42(背包)

    2024年02月13日
    瀏覽(19)
  • 代碼隨想錄 day44 完全背包

    class?Solution?{ public: ????int?change(int?amount,?vectorint?coins)?{ ????????vector?int?dp(amount+1,0); ????????dp[0]=1; ????????for(int?i=0;icoins.size();i++){ ????????????for(int?j=coins[i];j=amount;j++){ ????????????????dp[j]+=dp[j-coins[i]]; ????????????} ????????} ?

    2024年02月15日
    瀏覽(21)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包