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

LeetCode刷題筆記【29】:動態(tài)規(guī)劃專題-1(斐波那契數(shù)、爬樓梯、使用最小花費爬樓梯)

這篇具有很好參考價值的文章主要介紹了LeetCode刷題筆記【29】:動態(tài)規(guī)劃專題-1(斐波那契數(shù)、爬樓梯、使用最小花費爬樓梯)。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前置知識

解題思路

動態(tài)規(guī)劃(DP,Dynamic Programming)。
其解題思路對比貪心算法的“直接選局部最優(yōu)然后推導(dǎo)出全局最優(yōu)”;傾向于“由之前的結(jié)果推導(dǎo)得到后續(xù)的結(jié)果”。
很多時候二者具有相似性,不必死扣概念。

解題步驟

動態(tài)規(guī)劃題目的核心是dp數(shù)組的概念和構(gòu)建(遞推公式);
所以具體的解題步驟可以分為以下幾步:

  1. 確定dp數(shù)組(dp table)以及下標(biāo)的含義
  2. 確定遞推公式
  3. dp數(shù)組如何初始化
  4. 確定遍歷順序
  5. 舉例推導(dǎo)dp數(shù)組

動態(tài)規(guī)劃的debug

每走一步都將dp數(shù)組打印出來, 檢查是否和自己推導(dǎo)和計劃的一致.

當(dāng)出現(xiàn)bug的時候, 思考:

  • 這道題目我舉例推導(dǎo)狀態(tài)轉(zhuǎn)移公式了么?
  • 我打印dp數(shù)組的日志了么?
  • 打印出來了dp數(shù)組和我想的一樣么?

參考文章:動態(tài)規(guī)劃理論基礎(chǔ)

509. 斐波那契數(shù)

題目描述

LeetCode刷題筆記【29】:動態(tài)規(guī)劃專題-1(斐波那契數(shù)、爬樓梯、使用最小花費爬樓梯),LeetCode刷題筆記,leetcode,筆記,動態(tài)規(guī)劃,c++,算法,貪心算法

LeetCode鏈接:https://leetcode.cn/problems/fibonacci-number/description/

解題思路

因為是簡單題, 所以直接給出了遞推公式, 我們只需要先構(gòu)建dp數(shù)組的前兩項, 然后依次向后傳遞推導(dǎo)即可.

代碼

使用dp數(shù)組

class Solution {
public:
    int fib(int n) {
        vector<int> fei;
        fei.push_back(0);
        fei.push_back(1);
        for(int i=2; i<=n; ++i){
            fei.push_back(fei[i-1] + fei[i-2]);
        }
        return fei[n];
    }
};

優(yōu)化空間復(fù)雜度: 不用數(shù)組, 只用兩個變量記錄即可

class Solution {
public:
    int fib(int n) {
        if(n==0)    return 0;
        else if(n==1)   return 1;
        int first=0, second=1;
        for(int i=2; i<=n; ++i){
            int tmp = first + second;
            first = second;
            second = tmp;
        }
        return second;
    }
};

70. 爬樓梯

題目描述

LeetCode刷題筆記【29】:動態(tài)規(guī)劃專題-1(斐波那契數(shù)、爬樓梯、使用最小花費爬樓梯),LeetCode刷題筆記,leetcode,筆記,動態(tài)規(guī)劃,c++,算法,貪心算法

LeetCode鏈接:https://leetcode.cn/problems/climbing-stairs/description/

解題思路

本質(zhì)上和前一題的斐波那契數(shù)列是一樣的.

發(fā)現(xiàn)第i階的可能性, 是i-1階和i-2階的和
可以理解為: 從i-1階和i-2階都可以直接到達i階, 所以dp[i]=dp[i-1]+dp[i-2]

代碼

使用dp數(shù)組

class Solution {
public:
    int climbStairs(int n) {
        vector<int> dp;
        dp.push_back(1);
        dp.push_back(1);
        for(int i=2; i<=n; i++){
            dp.push_back(dp[i-1] + dp[i-2]);
        }
        return dp[n];
    }
};

優(yōu)化空間復(fù)雜度: 不用數(shù)組, 只用兩個變量記錄即可

class Solution {
public:
    int climbStairs(int n) {
        if(n==0 || n==1)    return 1;
        int first=1, second=1;
        for(int i=2; i<=n; i++){
            int tmp = first+second;
            first = second;
            second = tmp;
        }
        return second;
    }
};

746. 使用最小花費爬樓梯

題目描述

LeetCode刷題筆記【29】:動態(tài)規(guī)劃專題-1(斐波那契數(shù)、爬樓梯、使用最小花費爬樓梯),LeetCode刷題筆記,leetcode,筆記,動態(tài)規(guī)劃,c++,算法,貪心算法

LeetCode鏈接:https://leetcode.cn/problems/min-cost-climbing-stairs/description/

解題思路

思路: 動態(tài)規(guī)劃
dp[i] 表示從i處起跳的話, 需要支付的費用
那么就有: dp[i] = min(dp[i-1], dp[i-2]) + cost[i];

代碼

使用dp數(shù)組

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int n=cost.size();
        vector<int> dp(n);
        dp[0] = cost[0];
        dp[1] = cost[1];
        for(int i=2; i<n; ++i){
            dp[i] = min(dp[i-1], dp[i-2]) + cost[i];
        }
        return min(dp[n-1], dp[n-2]);
    }
};

優(yōu)化空間復(fù)雜度

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        int n=cost.size();
        int first = cost[0];
        int second = cost[1];
        for(int i=2; i<n; ++i){
            int tmp = min(first, second) + cost[i];
            first = second;
            second = tmp;
        }
        return min(first, second);
    }
};

另一種動態(tài)規(guī)劃思路

用另一種思路來構(gòu)建dp數(shù)組:
剛才認為"dp[i]是從i處起跳需要支付的代價", 現(xiàn)在認為"dp[i]是到達i需要支付的代價"
遞推公式也就變?yōu)? dp[i] = min(dp[i-1]+cost[i-1], dp[i-2]+cost[i-2]);

所以最開始的dp[0]dp[1]初始化為0, dp的長度也設(shè)置為cost.size()+1, 一路推導(dǎo)到dp[cost.size()], 直接return即可

class Solution {
public:
    int minCostClimbingStairs(vector<int>& cost) {
        vector<int> dp(cost.size() + 1);
        dp[0] = 0; // 默認第一步都是不花費體力的
        dp[1] = 0;
        for (int i = 2; i <= cost.size(); i++) {
            dp[i] = min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);
        }
        return dp[cost.size()];
    }
};

總結(jié)

本文參考:
斐波那契數(shù)
爬樓梯
使用最小花費爬樓梯文章來源地址http://www.zghlxwxcb.cn/news/detail-700449.html

到了這里,關(guān)于LeetCode刷題筆記【29】:動態(tài)規(guī)劃專題-1(斐波那契數(shù)、爬樓梯、使用最小花費爬樓梯)的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • LeetCode刷題筆記【30】:動態(tài)規(guī)劃專題-2(不同路徑、不同路徑 II)

    LeetCode刷題筆記【30】:動態(tài)規(guī)劃專題-2(不同路徑、不同路徑 II)

    參考前文 參考文章: LeetCode刷題筆記【29】:動態(tài)規(guī)劃專題-1(斐波那契數(shù)、爬樓梯、使用最小花費爬樓梯) LeetCode鏈接:https://leetcode.cn/problems/unique-paths/description/ 動態(tài)規(guī)劃 : 創(chuàng)建m×n的數(shù)組, 對應(yīng)這個地圖, 數(shù)組 val 表示 有幾種方法可以走到這一格 最開始, 第一行和第一列v

    2024年02月09日
    瀏覽(49)
  • (動態(tài)規(guī)劃) 劍指 Offer 10- I. 斐波那契數(shù)列 ——【Leetcode每日一題】

    (動態(tài)規(guī)劃) 劍指 Offer 10- I. 斐波那契數(shù)列 ——【Leetcode每日一題】

    難度:簡單 寫一個函數(shù),輸入 n ,求斐波那契(Fibonacci)數(shù)列的第 n 項(即 F(N) )。斐波那契數(shù)列的定義如下: F(0) = 0, F(1) = 1 F(N) = F(N - 1) + F(N - 2), 其中 N 1. 斐波那契數(shù)列由 0 和 1 開始,之后的斐波那契數(shù)就是由之前的兩數(shù)相加而得出。 答案需要取模 1e9+7(1000000007),如計

    2024年02月12日
    瀏覽(20)
  • 數(shù)據(jù)結(jié)構(gòu)與算法之動態(tài)規(guī)劃: Leetcode 509. 斐波那契數(shù) (Typescript版)

    斐波那契數(shù) https://leetcode.cn/problems/fibonacci-number/ 描述 斐波那契數(shù) (通常用 F(n) 表示)形成的序列稱為 斐波那契數(shù)列 。該數(shù)列由 0 和 1 開始,后面的每一項數(shù)字都是前面兩項數(shù)字的和。也就是: 給定 n ,請計算 F(n) 。 示例 1 示例 2 示例 3 提示 0 = n = 30 算法實現(xiàn) 1 )方案 1 這

    2024年02月04日
    瀏覽(29)
  • LeetCode刷題---斐波那契數(shù)列模型

    LeetCode刷題---斐波那契數(shù)列模型

    顧得泉: 個人主頁 個人專欄: 《Linux操作系統(tǒng)》??《C/C++》??《LeedCode刷題》 鍵盤敲爛,年薪百萬! 題目鏈接:1137. 第 N 個泰波那契數(shù)?? 泰波那契序列Tn定義如下: ????????T0=0,T1=1,T2= 1,且在n=0的條件下Tn+3= Tn+Tn+1t+Tn+2 ????????給你整數(shù)n,請返回第n個泰波那契數(shù)Tn的值

    2024年02月04日
    瀏覽(26)
  • 【LeetCode題目詳解】第九章 動態(tài)規(guī)劃part01 509. 斐波那契數(shù) 70. 爬樓梯 746. 使用最小花費爬樓梯 (day38補)

    【LeetCode題目詳解】第九章 動態(tài)規(guī)劃part01 509. 斐波那契數(shù) 70. 爬樓梯 746. 使用最小花費爬樓梯 (day38補)

    斐波那契數(shù) ?(通常用? F(n) 表示)形成的序列稱為 斐波那契數(shù)列 。該數(shù)列由? 0 和 1 開始,后面的每一項數(shù)字都是前面兩項數(shù)字的和。也就是: 給定? n ,請計算 F(n) 。 示例 1: 示例 2: 示例 3: 提示: 0 = n = 30 斐波那契數(shù)列大家應(yīng)該非常熟悉不過了,非常適合作為動規(guī)第

    2024年02月07日
    瀏覽(18)
  • 動態(tài)規(guī)劃-斐波那契數(shù)

    斐波那契數(shù)是一個很好的熟悉和理解動態(tài)規(guī)劃的例子,通過斐波那契數(shù)可以更好的理解動態(tài)規(guī)劃的精髓,動態(tài)規(guī)劃是后面的計算是如何借助于前面的計算結(jié)果來加快計算速度的。 斐波那契數(shù)和斐波那契數(shù)列其實可以看成是一道題,只不過兩題的限制性條件稍微有差別 斐波那

    2024年02月14日
    瀏覽(19)
  • 【動態(tài)規(guī)劃】斐波那契數(shù)列模型

    【動態(tài)規(guī)劃】斐波那契數(shù)列模型

    凍龜算法系列之斐波那契數(shù)列模型 動態(tài)規(guī)劃(英語:Dynamic programming,簡稱 DP) ,是一種在數(shù)學(xué)、管理科學(xué)、計算機科學(xué)、經(jīng)濟學(xué)和生物信息學(xué)中使用的,通過把原問題分解為相對簡單的子問題的方式求解復(fù)雜問題的方法。動態(tài)規(guī)劃常常適用于有重疊子問題和最優(yōu)子結(jié)構(gòu)性質(zhì)

    2024年02月09日
    瀏覽(21)
  • 【動態(tài)規(guī)劃】是泰波那契數(shù),不是斐波那契數(shù)

    【動態(tài)規(guī)劃】是泰波那契數(shù),不是斐波那契數(shù)

    Problem: 1137. 第 N 個泰波那契數(shù) 首先我們來解讀一下本題的意思?? 相信讀者在看到【泰波那契數(shù)】的時候,不禁會聯(lián)想到【斐波那契數(shù)】,它們呢是一對孿生兄弟,這個 泰波那契數(shù) 相當(dāng)于是 斐波那契數(shù) 的加強版 我們首先可以來看到這個遞推公式 Tn+3 = Tn + Tn+1 + Tn+2 ,讀者可

    2024年02月08日
    瀏覽(23)
  • 動態(tài)規(guī)劃02-斐波那契類型二

    給你一個整數(shù)數(shù)組 cost ,其中 cost[i] 是從樓梯第 i 個臺階向上爬需要支付的費用。一旦你支付此費用,即可選擇向上爬一個或者兩個臺階。 你可以選擇從下標(biāo)為 0 或下標(biāo)為 1 的臺階開始爬樓梯。 請你計算并返回達到樓梯頂部的最低花費。 真題點擊此處:746.使用最小花費爬樓

    2024年01月16日
    瀏覽(15)
  • 動態(tài)規(guī)劃01-斐波那契類型一

    斐波那契數(shù) (通常用 F(n) 表示)形成的序列稱為 斐波那契數(shù)列 。該數(shù)列由 0 和 1 開始,后面的每一項數(shù)字都是前面兩項數(shù)字的和。也就是: F(0) = 0,F(xiàn)(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n 1 給定 n ,請計算 F(n) 。 真題點擊此處:509.斐波那契數(shù) 解題方法:動態(tài)規(guī)劃 思路:斐波

    2024年02月04日
    瀏覽(17)

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

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

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

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包