【動態規劃-斐波那契數列模型】理解動態規劃:斐波那契數列的遞推模型

在這里插入圖片描述

算法相關知識點可以通過點擊以下鏈接進行學習一起加油!

動態規劃是一種解決最優化問題的強大技術,通過將問題分解為子問題并逐步求解來實現高效計算。斐波那契數列是動態規劃中經典的應用之一,其遞推關系非常適合用動態規劃進行優化。通過動態規劃,我們不僅能避免重復計算,從而大幅提高計算效率,還能直觀地理解遞推模型在實際問題中的應用。本文將帶你深入理解斐波那契數列的遞推模型,展示如何利用動態規劃來優化其計算過程,并探討這一方法的實際價值與應用。

請添加圖片描述

Alt

🌈個人主頁:是店小二呀
🌈C/C++專欄:C語言\ C++
🌈初/高階數據結構專欄: 初階數據結構\ 高階數據結構
🌈Linux專欄: Linux
🌈算法專欄:算法
🌈Mysql專欄:Mysql

🌈你可知:無人扶我青云志 我自踏雪至山巔 請添加圖片描述

文章目錄

  • 動態規劃前言介紹
    • 1137第 N 個泰波那契數
    • 面試題 08.01. 三步問題
    • LCR 088. 使用最小花費爬樓梯
    • 91. 解碼方法

動態規劃前言介紹

動態規劃(Dynamic Programming, DP)是一種解決最優化問題的方法,它將復雜問題拆解成多個簡單的子問題,通過保存子問題的解來避免重復計算,從而提高計算效率。

動態規劃適用于具有重疊子問題最優子結構的場景:

  1. 重疊子問題:問題可以被分解成相同的子問題,且子問題會重復計算。通過存儲這些子問題的解,可以避免重復計算,節省時間。
  2. 最優子結構:問題的最優解可以通過其子問題的最優解來構建,即最優解是由子問題的最優解組合而成。

動態規劃的基本思路】:

  1. 狀態表示
  • 這一部分是指DP表里面的值所表達的含義。通常可以從以下三個角度來確定:
    1. 題目要求:從題目的要求來定義狀態。
    2. 經驗 + 題目要求:結合經驗和題目要求確定狀態。
    3. 分析問題的過程中,發現重復子問題:在分析問題時,可以發現哪些是重復的子問題,進而決定狀態的定義。
  1. 狀態轉移方程
  • 狀態轉移方程描述了當前狀態如何由前一個或多個狀態推導出來。例如,dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3],這表示當前狀態是由前幾個狀態的值組合而成的。
  1. 初始化
  • 設置初始狀態,以確保在填表時不會越界。比如,對于斐波那契數列,dp[0]dp[1]可能需要提前設定為已知的初始值。
  1. 順序計算
  • 在填充狀態表時,必須保證填充當前狀態時,所依賴的先前狀態已經計算出來。這通常意味著需要按照一定的順序(例如,從小到大)來計算狀態。
  1. 返回值
  • 根據題目要求,返回最終的狀態值。例如,如果我們計算的是最短路徑、最大值或最優解,返回的是狀態表中相應位置的值。

1137第 N 個泰波那契數

題目】:1137. 第 N 個泰波那契數

在這里插入圖片描述

算法思路

這道題典型地使用動態規劃(DP)來快速計算所需元素,流程如下:

  1. 創建 DP 表
  2. 初始化
  3. 填表
  4. 返回結果

代碼實現

class Solution {
public:int tribonacci(int n) {if(n == 0) return 0;if(n == 1 || n == 2) return 1;vector<int> dp(n + 1);dp[0] = 0;dp[1] = dp[2] = 1;for(int i = 3; i <= n; i++)dp[i] = dp[i - 1] + dp[i - 2] + dp[ i- 3];return dp[n];}
};

優化方案】:滾動數組

在這里插入圖片描述

class Solution {
public:int tribonacci(int n) {if(n == 0) return 0;if(n == 1 || n == 2) return 1;vector<int> dp(n + 1);int a = 0, b = 1, c = 1, d = 0;for(int i = 3; i <= n; i++){d = a + b + c;//滾動操作 a = b; b = c; c =d;}return d;}
};

面試題 08.01. 三步問題

題目】:面試題 08.01. 三步問題

在這里插入圖片描述

算法思路

面對未知的題目時,可以通過繪圖尋找線索,幫助解決問題。例如,在這道題中,確定一個位置并列舉所有可能情況,可以發現規律。比如,表示i位置前面三次的情況,所有可能組合加起來就是i位置的答案。

在這里插入圖片描述

在這里插入圖片描述

筆試中不需要使用滾動數組,也不用花時間去做空間優化。平時不必刻意練習這些,效果有限。

代碼實現

class Solution {
public:int waysToStep(int n) {//1.創建dp表vector<int> dp(n + 2);if(n == 1 || n == 2) return n;if(n == 3) return 4;const int MOD = 1e9 + 7;//2.初始化dp[1] = 1;dp[2] = 2; dp[3] = 4;//3.填表for(int i = 4; i <= n; i++)dp[i] = ((dp[i - 1] + dp[i - 2])%MOD + dp[i - 3])%MOD;return dp[n];}
};

細節問題

對于這類需要取模的問題,每次計算(如加法、乘法等)都要取一次模,以防止溢出,否則答案可能會錯誤


LCR 088. 使用最小花費爬樓梯

題目】:LCR 088. 使用最小花費爬樓梯

在這里插入圖片描述

算法思路

解法一:

在這里插入圖片描述

【小技巧】:通過之前或之后的狀態推導出 dp[i] 的值。這類問題通常需要通過隱含或明確的遞推關系來確定某個位置的數值。

代碼實現

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int n = cost.size();//1.創建dp表vector<int>dp (n + 1);//2.初始化dp[0] = dp[1] = 0;//3.填表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];}
};

算法思路

解法二:

在這里插入圖片描述
在這里插入圖片描述

代碼實現

class Solution {
public:int minCostClimbingStairs(vector<int>& cost) {int n = cost.size();//1.創建dp表vector<int>dp (n);//2.初始化dp[n - 1] = cost[n -1]; dp[n - 2] = cost[n - 2];//3.填表for(int i = n - 3; i >= 0; i--)dp[i] = min(dp[i + 1], dp[i + 2]) + cost[i];return min(dp[0], dp[1]);}
};

91. 解碼方法

題目】:91. 解碼方法

在這里插入圖片描述

算法思路

在這里插入圖片描述

我們使用 dp[i] 表示以位置 i 結尾時的解碼方法總數。在分析位置 i 時,需要考慮兩種情況:一種是單獨解碼 s[i],另一種是將 s[i-1]s[i] 結合解碼。對于后者,必須滿足 s[i-1]s[i] 形成一個有效的兩位數(即在1到26之間,且沒有前導零)。

因此,狀態轉移方程為:dp[i] = dp[i-1] + dp[i-2],但只有在滿足解碼條件時,才能進行累加。這樣,我們能夠從整體上分析解碼的方案,而不是孤立地考慮每個子問題的解。

在這里插入圖片描述

個人思考

通過整體思路來解決解碼方案問題,結合這兩張圖片,可以更直觀地理解解法。

為什么是相加,難道不會重復嗎?其實,每個位置的解碼方式是基于前面所有元素的解碼結果,解法數量是通過添加‘單獨解碼’和‘雙位解碼’的方式得到的。因此,需要將之前的解碼方案數相加,因為每個步驟都是缺一不可的。

在這里插入圖片描述

在這里插入圖片描述

代碼實現

class Solution {
public:int numDecodings(string s) {              int n = s.size();//1.創建dp表vector<int> dp(n);//2.初始化dp[0] = s[0] != '0';if(n == 1) return dp[0];if(s[1] >= '1' && s[1] <= '9') dp[1] += dp[0];int t = (s[0] - '0') * 10 + (s[1] - '0');if(t >= 10 && t <= 26) dp[1] += 1;//3.填表操作for(int i = 2; i < n; i++){if(s[i] >= '1' && s[i] <= '9') dp[i] += dp[i - 1];int t = (s[i - 1] - '0') * 10 + (s[i] - '0');if(t >= 10 && t <= 26) dp[i] += dp[i - 2];}return dp[n - 1];}
};

在這里插入圖片描述
快和小二一起踏上精彩的算法之旅!關注我,我們將一起破解算法奧秘,探索更多實用且有趣的知識,開啟屬于你的編程冒險!

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

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

相關文章

微信小程序 自定義帶圖片彈窗

1. 微信小程序 自定義帶圖片彈窗1.1. 實現思路使用官方組件實現圖片模態彈窗。首先找到官方文檔&#xff1a;?顯示模態彈窗的API wx.showModal(OBJECT)wx.showModal參數介紹發現并沒有設置圖片的參數&#xff0c;但是這是一個API&#xff0c;但是組件呢&#xff1f;我并沒有在…

私有化大模型架構解決方案構建指南

內容概要本指南旨在為企業提供私有化大模型架構解決方案的全面構建路徑&#xff0c;幫助其在保障數據隱私的同時提升業務效率。我們將系統解析關鍵環節&#xff0c;包括安全部署策略設計、模型訓練核心技術、持續優化機制構建以及知識管理實踐路徑。此外&#xff0c;指南還涵蓋…

面試150 查找和最小的K對數字

思路1 超時法&#xff1a;通過兩個循環記錄三元組[num1,num2,num1num2]然后通過num1num2從小到大進行排序&#xff0c;然后返回前K個對數中的前兩個數即可。 class Solution:def kSmallestPairs(self, nums1: List[int], nums2: List[int], k: int) -> List[List[int]]:if n…

vscode目錄,右鍵菜單加入用VSCode打開文件和文件夾(快速解決)(含刪除)(腳本)

1.創建文本文件 在桌面右鍵單擊&#xff0c;選擇“新建” > “文本文檔”&#xff0c;將其命名為“vscode.txt”2.復制代碼內容3.修改文件擴展名 右鍵單擊“vscode.txt”文件&#xff0c;選擇“重命名”&#xff0c;將文件擴展名從.txt改為.reg&#xff0c;使其成為“vscode…

Chart.js 柱形圖詳解

Chart.js 柱形圖詳解 引言 在數據可視化領域&#xff0c;柱形圖是一種非常常見的圖表類型&#xff0c;它能夠直觀地展示不同類別或組的數據之間的比較。Chart.js 是一個基于 HTML5 Canvas 的開源庫&#xff0c;它提供了一系列的圖表繪制功能&#xff0c;其中包括柱形圖。本文將…

沉浸式文旅新玩法-基于4D GS技術的真人數字人賦能VR體驗升級

線下沉浸式劇場與 LBE VR 相結合&#xff0c;會碰撞出什么樣的火花&#xff1f;本次 PICO 視頻、東方演藝集團與火山引擎一起&#xff0c;將沉浸式演出《只此周莊》的部分場景復刻到了 VR 世界&#xff0c;讓用戶在虛擬的古代周莊夜市里&#xff0c;體驗了古老的故事以及精彩紛…

C程序內存布局詳解

C程序內存布局詳解 1. 內存布局概述 C程序在內存中分為以下幾個主要區域&#xff08;從低地址到高地址&#xff09;&#xff1a; 代碼段&#xff08;.text&#xff09;只讀數據段&#xff08;.rodata&#xff09;初始化數據段&#xff08;.data&#xff09;未初始化數據段&…

新手向:Git下載全攻略

Git 的安裝與重要性在現代軟件開發中&#xff0c;版本控制是必不可少的工具&#xff0c;而 Git 是目前最流行的分布式版本控制系統。無論是個人開發者還是大型團隊&#xff0c;Git 都能高效管理代碼變更&#xff0c;確保項目歷史清晰可追溯。安裝 Git 是開發者入門的第一步&…

linux中如何清除history命令

寫在前面 使用ssh遠程連接客戶端連接上linux后操作的命令多了&#xff0c;有時候需要清除對應的歷史命令記錄&#xff0c;可以通過下面幾種方式實現。第一種方法 通過修改.bash_history文件 這是最簡單直接的方法&#xff0c;但是只會影響當前用戶的歷史記錄。執行以下命令即可…

PHP插件開發中的一個錯誤:JSON直接輸出導致網站首頁異常

問題描述 最近在使用步數統計插件&#xff08;WeFootStep&#xff09;時&#xff0c;發現網站首頁完全變成了一段JSON數據&#xff0c;而不是正常的HTML頁面。具體表現為首頁顯示如下內容&#xff1a; {"results":"<li><a href\"https:\/\/blog…

落霞歸雁的思維框架:十大經典思維工具的源頭活水

在當今復雜多變的世界中&#xff0c;思維框架成為了解決問題、優化決策和提升效率的重要工具。提到思維框架&#xff0c;人們往往會想到那些被廣泛認可和應用的十大經典思維工具&#xff1a;金字塔原理、黃金圈法則、5W1H分析法、SWOT分析、SCQA模型、STAR法則、PDCA循環、六頂…

spring Could 高頻面試題

一、基礎概念Spring Cloud 的核心組件有哪些&#xff1f; 答案&#xff1a;Eureka/Nacos&#xff08;服務注冊發現&#xff09;、Ribbon/LoadBalancer&#xff08;負載均衡&#xff09;、Feign/OpenFeign&#xff08;聲明式HTTP客戶端&#xff09;、Hystrix/Sentinel&#xff0…

從零開始的云計算生活——番外6,使用zabbix對中間件監控

目錄 一.網絡設備監控 1、GNS模擬器的使用 創建路由 創建交換機 2.構建網絡 3.添加Cisco路由器的監控 二.中間件監控 1、MySQL數據庫監控 1.1、拷貝自定義的監控腳本到指定目錄 1.2、添加監控用戶 1.3、重啟zabbix-agent服務 1.4、在zabbix-server服務端測試數據 1…

haproxy七層均衡

一.haproxy的安裝和服務信息1.1實驗環境ip實驗設備172.25.254.100haproxy172.25.254.10RS1172.25.254.20RS2172.25.254.111client1.2軟件安裝及配置haproxy主機上配置#下載#進入此文件進行編輯#關閉防火墻RS1主機上配置#下載#生成默認文件#重啟#關閉防火墻RS2主機上配置#下載#生…

分類預測 | MATLAB實現CPO-SVM冠豪豬算法優化支持向量機分類預測

分類預測 | MATLAB實現CPO-SVM冠豪豬算法優化支持向量機分類預測 目錄 分類預測 | MATLAB實現CPO-SVM冠豪豬算法優化支持向量機分類預測 分類效果 基本介紹 算法步驟 參數設定 運行環境 應用場景 程序設計 參考資料 分類效果 基本介紹 該MATLAB代碼實現了基于冠豪豬優化算法(…

【MySQL 數據庫】MySQL基本查詢(第二節)

文章目錄&#x1f4dd;Update&#x1f309; 將孫悟空同學的數學成績變更為 80 分&#x1f309; 將曹孟德同學的數學成績變更為60分&#xff0c;語文成績變更為70分&#x1f309; 將總成績倒數前三的3位同學的數學成績加上30分&#x1f309;將所有同學的語文成績更新為原來的2倍…

Axios 響應攔截器

1.定義&#xff1a;響應攔截器&#xff08;Response Interceptor&#xff09;是一個可以在 axios 接收到服務器響應后&#xff0c;響應數據交給 .then() 處理之前執行的函數。你可以用它來統一處理響應數據&#xff0c;進行錯誤處理&#xff0c;或者對返回的數據做格式化和轉換…

k8s的nodeport和ingress

1.流量轉發圖targerport轉發到實際的容器端口containerPort&#xff08;后端端口&#xff09;nodeportingress2.配置場景總結字段作用對象必填示例值何時配置containerPort容器否80需明確記錄容器端口時&#xff08;推薦&#xff09;targetPortPod是80定義 Service 轉發規則時p…

VLA:自動駕駛的“新大腦”?

&#x1f525; 什么是 VLA&#xff1f;為什么突然火了&#xff1f;在自動駕駛圈子里&#xff0c;最近一個詞特別火&#xff1a;VLA。它不是某個新車的型號&#xff0c;也不是某家公司的新品牌&#xff0c;而是一種全新的智能架構&#xff0c;被稱為“自動駕駛的大腦2.0”。&…

Linux操作系統之線程(八):信號量sem

前言&#xff1a;大家好啊&#xff0c;我們上一篇文章已經講解了關于線程同步的一種辦法&#xff1a;運用條件變量cond。今天&#xff0c;我們就來學習一下線程同步的另外一種方法&#xff0c;信號量&#xff01;&#xff01;信號量呢有System V 信號量與POSIX 信號量&#xff…