LeetCode 746 使用最小花費爬樓梯

當然可以!LeetCode 746 是一道經典的動態規劃入門題,我來用 C++ 為你詳細解釋。

題目描述

給定一個整數數組 cost,其中每個元素 cost[i] 表示從第 i 個臺階向上爬需要支付的費用。一旦支付費用,你可以選擇向上爬 1 步2 步
你可以從下標 01 的臺階開始爬。
目標:計算到達樓梯頂部(即最后一個臺階之后)的最小總花費。

核心思路

  1. 動態規劃定義
    dp[i] 表示到達第 i 個臺階所需的最小總花費。
    最終答案dp[n],其中 n = cost.size()(即到達頂部的最小花費)。

  2. 狀態轉移方程
    到達第 i 個臺階的方式有兩種:

    • 從第 i-1 個臺階爬一步,總花費為 dp[i-1] + cost[i-1]
    • 從第 i-2 個臺階爬兩步,總花費為 dp[i-2] + cost[i-2]
      因此:
    dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2])
    
  3. 初始條件

    • dp[0] = 0:無需花費即可站在起點前。
    • dp[1] = 0:同理,可選擇從下標 0 或 1 開始,無需初始花費。

C++ 代碼實現

#include <vector>
#include <algorithm>
using namespace std;class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int n = cost.size();if (n == 0) return 0;vector<int> dp(n + 1, 0);  // dp[i] 表示到達第 i 個臺階的最小花費// 初始化:站在起點前(0 或 1)不需要花費dp[0] = 0;dp[1] = 0;// 動態規劃計算for (int i = 2; i <= n; ++i) {dp[i] = min(dp[i-1] + cost[i-1], dp[i-2] + cost[i-2]);}return dp[n];  // 到達頂部(第 n 個臺階)的最小花費}
};

優化空間復雜度

由于 dp[i] 只依賴于 dp[i-1]dp[i-2],可以用兩個變量滾動優化:

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

示例解釋

輸入:cost = [10, 15, 20]

  • dp[0] = 0
  • dp[1] = 0
  • dp[2] = min(dp[1] + 15, dp[0] + 10) = min(0 + 15, 0 + 10) = 10
  • dp[3] = min(dp[2] + 20, dp[1] + 15) = min(10 + 20, 0 + 15) = 15
    輸出:15(從下標 1 開始,支付 15,直接跳兩步到頂部)

關鍵點總結

  1. 動態規劃思想:用 dp 數組記錄到達每個臺階的最小花費。
  2. 狀態轉移:當前狀態只依賴前兩個狀態,可用滾動數組優化空間。
  3. 初始條件:起點前的位置無需花費。

這類問題是動態規劃的基礎,掌握后可輕松解決更復雜的路徑優化問題!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/905982.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/905982.shtml
英文地址,請注明出處:http://en.pswp.cn/news/905982.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

6.1.1圖的基本概念

基本概念 圖&#xff1a; 頂點集邊集 頂點集&#xff1a;所有頂點的集合&#xff0c;不能為空&#xff08;因為圖是頂點集和邊集組成&#xff0c;其中一個頂點集不能為空&#xff0c;則圖肯定不為空&#xff09; 邊集&#xff1a;所有邊的集合&#xff0c;邊是由頂點集中的2…

WeakAuras Lua Script [TOC BOSS 5 - Anub‘arak ]

WeakAuras Lua Script [TOC BOSS 5 - Anubarak ] 阿努巴拉克 - 小強中蟲范圍 插件 !WA:2!DE1B0Xrvv8UmuRmIqZwiaXQmgKycwsYUPjPLZPTz3nBYULKnBNDtlYP6o)7T7mMzNz6BMnnBefBqGacIUOsXIkSIki)rCbLkIhLi6h8t3to6h9G2dXt4R9d(rR33mt2MyepQ75KSV3BUZ9FV7VF37g54rDvgU)yX7)GrRgvlQ2Y…

【C/C++】深度探索c++對象模型_筆記

1. 對象內存布局 (1) 普通類&#xff08;無虛函數&#xff09; 成員變量排列&#xff1a;按聲明順序存儲&#xff0c;但編譯器會根據內存對齊規則插入填充字節&#xff08;padding&#xff09;。class Simple {char a; // 1字節&#xff08;偏移0&#xff09;int b; …

湖北理元理律師事務所:債務優化中的雙維支持實踐解析

在債務壓力與生活質量失衡的社會議題下&#xff0c;法律服務機構的功能邊界正在從單一的法律咨詢向復合型支持延伸。湖北理元理律師事務所通過“法律心理”雙維服務模式&#xff0c;探索債務優化與生活保障的平衡路徑&#xff0c;其方法論或為行業提供實踐參考。 法律框架&…

Python uv包管理器使用指南:從入門到精通

Python uv包管理器使用指南&#xff1a;從入門到精通 作為一名Python開發者&#xff0c;你是否曾經為虛擬環境管理和依賴包安裝而頭疼&#xff1f;今天我要向大家介紹一個強大的工具——uv包管理器&#xff0c;它將徹底改變你的Python開發體驗。 什么是uv包管理器&#xff1f…

Windows系統安全加固

掌握的加固點&#xff1a; 用戶系統檢查 口令策略檢查 日志審計檢查 安全選項檢查 信息保護檢查 2.2.1 用戶系統檢查 #檢查系統版本內核 判斷依據&#xff1a;無 檢查方式&#xff1a;命令 msinfo32 dxdiag查看 #檢查Administrator賬號是否停用 判斷依據&#xff1a;禁…

小蝸牛撥號助手用戶使用手冊

一、軟件簡介 小蝸牛撥號助手是一款便捷實用的撥號輔助工具&#xff0c;能自動識別剪貼板中的電話號碼&#xff0c;支持快速撥號操作。最小化或關閉窗口后&#xff0c;程序將在系統后臺運行&#xff0c;還可設置開機自啟&#xff0c;方便隨時使用&#xff0c;提升撥號效率。 …

c/c++消息隊列庫RabbitMQ的使用

RabbitMQ C 消息隊列組件設計與實現文檔 1. 引言 1.1. RabbitMQ 簡介 RabbitMQ 是一個開源的消息代理軟件&#xff08;也稱為面向消息的中間件&#xff09;&#xff0c;它實現了高級消息隊列協議&#xff08;AMQP&#xff09;。RabbitMQ 服務器是用 Erlang 語言編寫的&#…

線程(二)OpenJDK 17 中線程啟動的完整流程用C++ 源碼詳解之主-子線程通信機制

深入解析OpenJDK 17中Java線程的創建與主-子線程通信機制 引言 在Java中&#xff0c;線程的創建與啟動通過Thread.start()實現&#xff0c;但底層是JVM與操作系統協作完成的復雜過程。本文基于OpenJDK 17的C源碼&#xff0c;揭秘Java線程創建時主線程與子線程的通信機制&…

多線程爬蟲語言選擇與實現

之前文中有人提到&#xff1a;想要一個簡單易用、能快速實現多線程爬蟲的方案&#xff0c;而且目標是小網站&#xff0c;基本可以確定對反爬蟲措施要求不高&#xff0c;這些就比較簡單了。 以往我肯定要考慮常見的編程語言中哪些適合爬蟲。Python、JavaScript&#xff08;Node…

AMD Vivado? 設計套件生成加密比特流和加密密鑰

概括 重要提示&#xff1a;有關使用AMD Vivado? Design Suite 2016.4 及更早版本進行 eFUSE 編程的重要更新&#xff0c;請參閱AMD設計咨詢 68832 。 本應用說明介紹了使用AMD Vivado? 設計套件生成加密比特流和加密密鑰&#xff08;高級加密標準伽羅瓦/計數器模式 (AES-GCM)…

Unity3D仿星露谷物語開發44之收集農作物

1、目標 在土地中挖掘后&#xff0c;灑下種子后逐漸成長&#xff0c;然后使用籃子收集成熟后的農作物&#xff0c;工具欄中也會相應地增加該農作物。 2、修改CropStandard的參數 Assets -> Prefabs -> Crop下的CropStandard&#xff0c;修改其Box Collider 2D的Size(Y…

list重點接口及模擬實現

list功能介紹 c中list是使用雙向鏈表實現的一個容器&#xff0c;這個容器可以實現。插入&#xff0c;刪除等的操作。與vector相比&#xff0c;vector適合尾插和尾刪&#xff08;vector的實現是使用了動態數組的方式。在進行頭刪和頭插的時候后面的數據會進行挪動&#xff0c;時…

CE17.【C++ Cont】練習題組17(堆專題)

目錄 1.P2085 最小函數值 題目 分析 方法1:暴力求解 方法2:二次函數的性質(推薦!) 代碼 提交結果 2.P1631 序列合并 分析 方法1:建兩個堆 第一版代碼 提交結果 第二版代碼 提交結果 第三版代碼 提交結果 方法2:只建一個堆 代碼 提交結果 1.P2085 最小函數值…

題單:表達式求值1

題目描述 給定一個只包含 “加法” 和 “乘法” 的算術表達式&#xff0c;請你編程計算表達式的值。 輸入格式 輸入僅有一行&#xff0c;為需要計算的表達式&#xff0c;表達式中只包含數字、加法運算符 和乘法運算符 *&#xff0c;且沒有括號。 所有參與運算的數字不超過…

DeepSeek超大模型的高效訓練策略

算力挑戰 訓練DeepSeek此類千億乃至萬億級別參數模型,對算力資源提出了極高要求。以DeepSeek-V3為例,其基礎模型參數量為67億,采用專家混合(MoE)架構后實際激活參數可達幾百億。如此規模的模型遠超單張GPU顯存容量極限,必須借助分布式并行才能加載和訓練。具體挑戰主要包…

MFC中DoDataExchange的簡明指南

基本概念 DoDataExchange 是 MFC 框架中實現數據自動同步的核心函數&#xff0c;主要用于對話框中控件與成員變量的雙向綁定。它能讓控件中的數據和成員變量自動保持一致&#xff0c;無需手動讀寫控件數據。 使用示例 1&#xff09;變量聲明 在對話框頭文件中聲明與控件對應…

FreeCAD源碼分析: Transaction實現原理

本文闡述FreeCAD中Transaction的實現原理。 注1&#xff1a;限于研究水平&#xff0c;分析難免不當&#xff0c;歡迎批評指正。 注2&#xff1a;文章內容會不定期更新。 一、概念 Ref. from What is a Transaction? A transaction is a group of operations that have the f…

C++類與對象--1 特性一:封裝

C面向對象三大特性&#xff1a; &#xff08;1&#xff09;封裝&#xff1b;&#xff08;2&#xff09;繼承&#xff1b;&#xff08;3&#xff09;多態&#xff1b; C認為萬物皆是對象&#xff0c;對象上有對應的屬性&#xff08;數據&#xff09;和行為&#xff08;方法&…

初探Reforcement Learning強化學習【QLearning/Sarsa/DQN】

文章目錄 一、Q-learning現實理解&#xff1a;舉例&#xff1a;回顧&#xff1a; 二、Sarsa和Q-learning的區別 三、Deep Q-NetworkDeep Q-Network是如何工作的&#xff1f;前處理&#xff1a;Convolution NetworksExperience Replay 一、Q-learning 是RL中model-free、value-…