NO.82十六屆藍橋杯備戰|動態規劃-從記憶化搜索到動態規劃|下樓梯|數字三角形(C++)

  1. 記憶化搜索
    在搜索的過程中,如果搜索樹中有很多重復的結點,此時可以通過?個"備忘錄",記錄第?次搜索到的結果。當下?次搜索到這個結點時,直接在"備忘錄"??找結果。其中,搜索樹中的?個?個結點,也稱為?個?個狀態。
    ?如經典的斐波那契數列問題
int f[N]; // 備忘錄  int fib(int n)  
{  // 搜索之前先往備忘錄??瞅瞅  if(f[n] != -1) return f[n];  if(n == 0 || n == 1) return f[n] = n;  // 返回之前,把結果記錄在備忘錄中  f[n] = fib(n - 1) + fib(n - 2);  return f[n];  
}
  1. 遞歸改遞推
    在?記憶化搜索解決斐波那契問題時,如果關注"備忘錄"的填寫過程,會發現它是從左往右依次填寫的。當i位置前?的格?填寫完畢之后,就可以根據格???的值計算出i位置的值。所以,整個遞歸過程,我們也可以改寫成循環的形式,也就是遞推
int f[N]; // f[i] 表?:第 i 個斐波那契數  
int fib(int n)  
{  // 初始化前兩個格?  f[0] = 0; f[1] = 1;  // 按照遞推公式計算后?的值  for(int i = 2; i <= n; i++)  {  f[i] = f[i - 1] + f[i - 2];  }  // 返回結果  return f[n];  
}
  1. 動態規劃
    動態規劃(Dynamic Programming,簡稱DP)是?種?于解決多階段決策問題的算法思想。它通過將復雜問題分解為更?的?問題,并存儲?問題的解(通常稱為“狀態”),從?避免重復計算,提?效率。因此,動態規劃?,蘊含著分治與剪枝思想。
    上述通過記憶化搜索以及遞推解決斐波那契數列的?式,其實都是動態規劃。
    注意:
  • 動態規劃中的相關概念其實遠不?如此,還會有:重疊?問題、最優?結構、?后效性、有向?環圖等等。
  • 這些概念沒有?段時間的沉淀是不可能完全理解的。可以等學過?段時間之后,再去接觸這些概念。不過,這些概念即使不懂,也不影響做題~
    在遞推形式的動態規劃中,常?下?的專有名詞來表述:
  1. 狀態表?:指 f 數組中,每?個格?代表的含義。其中,這個數組也會稱為 dp 數組,或者dp 表。
  2. 狀態轉移?程:指 f 數組中,每?個格?是如何?其余的格?推導出來的
  3. 初始化:在填表之前,根據題?中的默認條件或者問題的默認初始狀態,將 f 數組中若?格?先填上值。
    其實遞推形式的動態規劃中的各種表述,是可以對應到遞歸形式的:
  • 狀態表?<—>遞歸函數的意義;
  • 狀態轉移?程<—>遞歸函數的主函數體;
  • 初始化<—>遞歸函數的遞歸出?。
  1. 如何利?動態規劃解決問題
    第?種?式當然就是記憶化搜索了:
  • 先?遞歸的思想去解決問題;
  • 如果有重復?問題,就改成記憶化搜索的形式。
    第?種?式,直接使?遞推形式的動態規劃解決:
  1. 定義狀態表?:
    ?般情況下根據經驗+遞歸函數的意義,賦予 dp 數組相應的含義。(其實還可以去蒙?個,如果蒙的狀態表?能解決問題,說明蒙對了。如果蒙錯了,再換?個試~)
  2. 推導狀態轉移?程:
    根據狀態表?以及題意,在 dp 表中分析,當前格?如何通過其余格?推導出來。
  3. 初始化:
    根據題意,先將顯?易?的以及邊界情況下的位置填上值。
  4. 確定填表順序:
    根據狀態轉移?程,確定按照什么順序來填表。
  5. 確定最終結果:
    根據題意,在表中找出最終結果
P10250 [GESP樣題 六級] 下樓梯 - 洛谷

因為上樓和下樓是?個可逆的過程,因此我們可以把下樓問題轉化成上到第n個臺階,?共有多少種?案。
解法:動態規劃

  1. 狀態表?:
    dp[i] 表?:?到第i 個臺階的總?案數。
    那最終結果就是在dp[n]處取到。
  2. 狀態轉移?程:
    根據最后?步劃分問題,?到第i 個臺階的?式有三種:
    a. 從i - 1 臺階向上?1 個臺階,此時?到i 臺階的?案就是dp[i - 1]
    b. 從i - 2 臺階向上?2 個臺階,此時?到i 臺階的?案就是dp[i - 2]
    c. 從i - 3 臺階向上?3 個臺階,此時?到i 臺階的?案就是dp[i - 3]
    綜上所述,dp[i] = dp[i - 1] + dp[i - 2] + dp[i - 3]
  3. 初始化:
    填i位置的值時,?少需要前三個位置的值,因此需要初始化dp[0] = 1, dp[1] = 1, dp[2] = 2,然后從i = 3開始填。
    或者初始化dp[1] = 1, dp[2] = 2, dp[3] = 4,然后從i = 4 開始填。
  4. 填表順序:
    明顯是從左往右
#include <bits/stdc++.h>
using namespace std;typedef long long LL;const int N = 65;int n;
LL f[N]; //f[i]表示有i個臺階的時候,一共有多少種方案int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n;//初始化f[0] = 1; f[1] = 1; f[2] = 2;for (int i = 3; i <= n; i++){f[i] = f[i - 1] + f[i - 2] + f[i - 3];       }cout << f[n] << endl;return 0;
}

動態規劃的空間優化:
我們發現,在填寫dp[i]的值時,我們僅僅需要前三個格?的值,第i-4個及其之前的格?的值已經毫??處了。因此,可以?三個變量記錄i位置之前三個格?的值,然后在填完i位置的值之
后,滾動向后更新
![[Pasted image 20250409153812.png]]

#include <bits/stdc++.h>
using namespace std;typedef long long LL;const int N = 65;int n;int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n;LL a = 1, b = 1, c = 2;for (int i = 3; i <= n; i++){LL t = a + b + c;a = b;b = c;c = t;}if (n == 1) cout << b << endl;else cout << c << endl;return 0;
}
P1216 [IOI 1994] 數字三角形 Number Triangles - 洛谷

![[Pasted image 20250409160024.png]]

學習動態規劃最經典的??題。
解法:動態規劃

  1. 狀態表?:
    dp[i][j] 表?:?到[i, j] 位置的最?權值。
    那最終結果就是在dp 表的第n ?中,所有元素的最?值。
  2. 狀態轉移?程:
    根據最后?步劃分問題,?到[i, j] 位置的?式有兩種:
    a. 從[i - 1, j] 位置向下??格,此時?到[i, j] 位置的最?權值就是dp[i - 1][j]
    b. 從[i - 1, j - 1]位置向右下??格,此時?到[i, j] 位置的最?權值就是dp[i - 1][j - 1]
    綜上所述,應該是兩種情況的最?值再加上[i,j]位置的權值:
    dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - 1]) + a[i][j]
  3. 初始化:
    因為dp 表被0 包圍著,并不影響我們的最終結果,因此可以直接填表。
    思考,如果權值出現負數的話,需不需要初始化?
    ? 此時可以全都初始化為 ? ∞ -\infty ? ,負?窮?在取max 之后,并不影響最終結果。
  4. 填表順序:
    從左往右填寫每??,每??從左往右
#include <bits/stdc++.h>
using namespace std;const int N = 1010;int n;
int a[N][N];
int f[N][N]; //f[i][j]表示從1,1走到i,j的時候,所有方案數的最大權值int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n;for (int i = 1; i <= n; i++)for (int j = 1; j <= i; j++)cin >> a[i][j];for (int i = 1; i <= n; i++){for (int j = 1; j <= i; j++){f[i][j] = max(f[i-1][j], f[i-1][j-1]) + a[i][j];    }}int ret = 0;for (int j = 1; j <= n; j++){ret = max(ret, f[n][j]);        }cout << ret << endl;return 0;
}

動態規劃的空間優化:
我們發現,在填寫第i ?的值時,我們僅僅需要前??的值,并不需要第i - 2 以及之前?的值。
因此,我們可以只??個?維數組來記錄上??的結果,然后在這個數組上更新當前?的值
![[Pasted image 20250409161744.png]]

需要注意,當?因為我們當前這個位置的值需要左上?位置的值,因此滾動數組優化的時候,要改變第?維的遍歷順序

#include <bits/stdc++.h>
using namespace std;const int N = 1010;int n;
int a[N][N];
int f[N]; //f[i][j]表示從1,1走到i,j的時候,所有方案數的最大權值int main()
{ios::sync_with_stdio(false);cin.tie(0);cin >> n;for (int i = 1; i <= n; i++)for (int j = 1; j <= i; j++)cin >> a[i][j];for (int i = 1; i <= n; i++){for (int j = i; j >= 1; j--){f[j] = max(f[j], f[j-1]) + a[i][j];    }}int ret = 0;for (int j = 1; j <= n; j++){ret = max(ret, f[j]);        }cout << ret << endl;return 0;
}

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

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

相關文章

使用 VBA 宏創建一個選擇全部word圖片快捷指令,進行圖片格式編輯

使用 VBA 宏批量選擇圖片 ? 第一步&#xff1a;創建 .dotm 加載項文件 1、使用環境 office word 365&#xff0c;文件格式為.docx 圖片格式為.PNG 2、創建 .dotm 加載項文件 打開 Word&#xff0c;新建一個空白文檔。 按下 Alt F11 打開 VBA 編輯器。 點擊菜單欄&#xff…

深度學習的下一個突破:從圖像識別到情境理解

引言 過去十年&#xff0c;深度學習在圖像識別領域取得了驚人的突破。從2012年ImageNet大賽上的AlexNet&#xff0c;到后來的ResNet、EfficientNet&#xff0c;再到近年來Transformer架構的崛起&#xff0c;AI已經能在許多任務上超越人類&#xff0c;比如人臉識別、目標檢測、醫…

使用dyn4j做碰撞檢測

文章目錄 前言一、環境準備添加依賴基本概念 二、實現步驟1.創建世界2.添加物體3.設置碰撞監聽器4.更新世界 三、完整代碼示例四、優化補充總結 前言 dyn4j 提供了高效的碰撞檢測和物理模擬功能&#xff0c;適用于游戲開發、動畫制作以及其他需要物理交互的場景。通過簡單的 A…

VS Code settings.json 文件中常用的預定義變量?及其用途說明

VS Code settings.json 常用預定義變量 以下是 Visual Studio Code 配置文件中常用的預定義變量列表&#xff1a; 1. 工作區相關變量 變量描述示例值${workspaceFolder}當前工作區根目錄的絕對路徑C:/projects/my-project${workspaceFolderBasename}工作區文件夾名稱&#x…

elasticSearch-搜索引擎

搜索引擎的優勢 有了數據庫分頁查詢&#xff0c;為什么還需要搜索引擎&#xff1f; 搜索引擎速度上很快數據庫分頁查詢&#xff0c;隨著數據庫數據量增大&#xff0c;頁數靠后&#xff0c;會導致搜索速度變慢&#xff0c;但是搜索引擎不會搜索引擎支持分詞查詢&#xff0c;地…

安裝OpenJDK1.8 17 (macos M芯片)

安裝OpenJDK 1.8 下載完后&#xff0c;解壓&#xff0c;打開 環境變量的配置文件即可 vim ~/.zshrc #export JAVA_HOME/Users/xxxxx/jdk-21.jdk/Contents/Home #export JAVA_HOME/Users/xxxxx/jdk-17.jdk/Contents/Home #export JAVA_HOME/Users/xxxxx/jdk-11.jdk/Contents…

斷言與反射——以golang為例

斷言 x.(T) 檢查x的動態類型是否是T&#xff0c;其中x必須是接口值。 簡單使用 func main() {var x interface{}x 100value1, ok : x.(int)if ok {fmt.Println(value1)}value2, ok : x.(string)if ok {//未打印fmt.Println(value2)} }需要注意如果不接受第二個參數就是OK,這…

Java設計模式:系統性解析與核心模式

一、設計模式三大分類總覽 創建型模式&#xff08;5種&#xff09; 核心目標&#xff1a;對象創建的優化與解耦 單例模式&#xff08;Singleton&#xff09; 工廠模式&#xff08;Factory&#xff09; 抽象工廠模式&#xff08;Abstract Factory&#xff09; 建造者模式&#…

Elasticsearch 向量數據庫,原生支持 Google Cloud Vertex AI 平臺

作者&#xff1a;來自 Elastic Valerio Arvizzigno Elasticsearch 將作為第一個第三方原生語義對齊引擎&#xff0c;支持 Google Cloud 的 Vertex AI 平臺和 Google 的 Gemini 模型。這使得聯合用戶能夠基于企業數據構建完全可定制的生成式 AI 體驗&#xff0c;并借助 Elastics…

408 計算機網絡 知識點記憶(7)

前言 本文基于王道考研課程與湖科大計算機網絡課程教學內容&#xff0c;系統梳理核心知識記憶點和框架&#xff0c;既為個人復習沉淀思考&#xff0c;亦希望能與同行者互助共進。&#xff08;PS&#xff1a;后續將持續迭代優化細節&#xff09; 往期內容 408 計算機網絡 知識…

10-MySQL-性能優化思路

1、優化思路 當我們發現了一個慢SQL的問題的時候,需要做性能優化,一般我們是為了提高SQL查詢更快,一個查詢的流程由下圖的各環節組成,每個環節都會消耗時間,要減少消耗時候需要從各個環節都分析一遍。 2 連接配置優化 第一個環節是客戶端連接到服務端,這塊可能會出現服務…

Docker:安裝與部署 Nacos 的技術指南

1、簡述 Nacos(Dynamic Naming and Configuration Service)是阿里巴巴開源的一個動態服務發現、配置管理和服務治理的綜合解決方案,適用于微服務架構。 Nacos 主要功能: 服務發現與注冊:支持 Dubbo、Spring Cloud 等主流微服務框架的服務發現與注冊。動態配置管理:支持…

【非機動車檢測】用YOLOv8實現非機動車及駕駛人佩戴安全帽檢測

非機動車及駕駛人佩戴安全帽檢測任務的意義主要包括以下幾點&#xff1a; 保障行車安全&#xff1a;非機動車包括自行車、電動車等&#xff0c;佩戴安全帽能夠有效保護騎車人頭部&#xff0c;減少因交通事故造成的頭部傷害風險&#xff0c;提高行車安全系數。 符合交通法規&am…

壹起航:15年深耕互聯網營銷,助力中國工廠出海獲客

在全球化浪潮下&#xff0c;越來越多的中國工廠渴望拓展海外市場&#xff0c;但面臨品牌建立、穩定詢盤獲取及營銷成本降低等多重挑戰。壹起航憑借15年的豐富經驗&#xff0c;整合外貿建站、SEO優化及海外短視頻營銷&#xff0c;為中國工廠提供一站式出海解決方案。 一、外貿獨…

Emacs 折騰日記(二十)——修改emacs的一些默認行為

上一篇我們完成了emacs輸入法的配置以及將emacs配置成了使用vim的操作方式。但是emacs目前有些默認行為我不太喜歡&#xff0c;這節我們一起來修改它 備份設置 我們打開emacs的配置文件所在路徑&#xff0c;發現有大量的~結尾的文件&#xff0c;這是emacs的備份文件。這里&am…

聊透多線程編程-線程基礎-4.C# Thread 子線程執行完成后通知主線程執行特定動作

在多線程編程中&#xff0c;線程之間的同步和通信是一個常見的需求。例如&#xff0c;我們可能需要一個子線程完成某些任務后通知主線程&#xff0c;并由主線程執行特定的動作。本文將基于一個示例程序&#xff0c;詳細講解如何使用 AutoResetEvent 來實現這種場景。 示例代碼…

【網絡安全 | 項目開發】Web 安全響應頭掃描器(提升網站安全性)

原創項目,未經許可,不得轉載。 文章目錄 項目簡介工作流程示例輸出技術棧項目代碼使用說明項目簡介 安全響應頭是防止常見 Web 攻擊(如點擊劫持、跨站腳本攻擊等)的有效防線,因此合理的配置這些頭部信息對任何網站的安全至關重要。 Web 安全響應頭掃描器(Security Head…

使用libcurl編寫爬蟲程序指南

用戶想知道用Curl庫編寫的爬蟲程序是什么樣的。首先&#xff0c;我需要明確Curl本身是一個命令行工具和庫&#xff0c;用于傳輸數據&#xff0c;支持多種協議。而用戶提到的“Curl庫”可能指的是libcurl&#xff0c;這是一個客戶端URL傳輸庫&#xff0c;可以用在C、C等編程語言…

使用pip3安裝PyTorch與PyG,實現NVIDIA CUDA GPU加速

使用python3的pip3命令安裝python依賴庫。 # python3 -V Python 3.12.3 # # pip3 -V pip 25.0.1 from /root/.pyenv/versions/3.12.3/lib/python3.12/site-packages/pip (python 3.12)Usage: pip3 install [options] <package> ...pip3 install [options] -r <re…

五種常用的web加密算法

文章目錄 五種常用Web加密算法實戰及原理詳解1. AES (高級加密標準)原理詳解應用場景實戰代碼&#xff08;Node.js&#xff09; 2. RSA (非對稱加密)原理詳解應用場景實戰代碼&#xff08;Node.js&#xff09; 3. SHA-256 (安全哈希算法)原理詳解應用場景實戰代碼&#xff08;瀏…