dp_走方格(包含dfs分析,記憶化搜索)

類似題目解析:dp_最長上升子序列(包含dfs分析,記憶化搜索)-CSDN博客

題目鏈接:2067. 走方格 - AcWing題庫

題目圖片:

分析題目(dfs)

這個題目說有一個行為n行,列為m列,在這個長方形里從左上角走到右下角,只能往右走,或者往下——》翻譯過來就是一個二維數組的某個值f[i][j]只有兩個選擇——變成f[i+1][j],或者變成f[i][j+1],求出方案數。(注意有個條件是不能走行號和列號同時為偶數的地方)

這種有多種選擇題,顯而易見先用dfs思考,

首先行號和列號同時為偶數——》選擇不走

正常的——》可以選擇走,也可以選擇不走

到達最大值了——》也就是邊界

上面就把dfs函數的具體思路分析出來了,下面展示代碼——》

#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;int n,m;int dfs(int x, int y) {if (x % 2 == 0 && y % 2 == 0) {return 0; // x和y均為偶數,無法移動,路徑數為0}if (x == n && y == m) {return 1; // 到達終點,返回1條路徑}int count = 0;if (x < n) count += dfs(x + 1, y);if (y < m) count += dfs(x, y + 1);return count;
}int main()
{scanf("%d%d",&n,&m);cout<<dfs(1,1);return 0;
}

上面代碼其中的dfs函數就是按照一開始分析的方式寫出來的,而先判斷是不是都為偶數和先判斷是不是到結尾點了的順序不是很重要。

那么這個顯而易見超時了,所以開始記憶化搜索優化——?

記憶化搜索優化

▌核心思路:
在普通DFS中,若存在大量重復訪問的相同狀態參數組合,則需要用數組/哈希表存儲該狀態的答案,避免重復遞歸。

  • 狀態定義:將遞歸函數的所有可變參數(如坐標、剩余步長、標記位等)作為狀態維度
    (例:二維網格路徑問題中,狀態是坐標?(x,y)
  • 容器選擇:優先用多維數組存儲,若參數范圍過大可用unordered_map等哈希結構

在遞歸函數的第一行檢查當前狀態是否已計算過(是否在數組里存儲過),若存在緩存結果則直接返回,否則繼續遞歸。

無論遞歸路徑如何,在返回結果前必須將計算結果存入緩存容器。需特別注意:

  1. 所有分支都要存儲結果(包括邊界條件和中間狀態)
  2. 存儲時機:在計算完所有子狀態后,通過mem[x][y] = result和return result來操作。

代碼如下:

#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;
const int N=31;
int n,m;
int mem[N][N];int dfs(int x, int y) {if(mem[x][y])return mem[x][y];int p=0;if(x%2==0&&y%2==0){return 0;//這個不變成p=1是因為?//p=1 僅在到達終點時觸發,表示找到一條合法路徑。//而 x 和 y 均為偶數的坐標是非法停留點,此時沒有任何合法路徑能通過該點到達終點,因此必須返回 0。}if(x==n&&y==m){p=1;}if(x<n) p+=dfs(x+1,y);if(y<m) p+=dfs(x,y+1);mem[x][y]=p;return p;
}int main()
{scanf("%d%d",&n,&m);cout<<dfs(1,1);return 0;
}

dp

從記憶化搜索變成dp的核心規律
記憶化搜索中的遞歸參數與動態規劃的狀態維度必須保持嚴格對應關系。記憶化搜索的dfs(a,b,c)參數表即對應動態規劃的dp[a][b][c]狀態定義。

其次,如果剛開始dfs是從開始的1,1推到n,m的,那dp就要從最后開始遞推回去。

所以動態規劃的二維數組的兩個維度范圍定了

是從n到1,另一個從m到1。

其中的公式思路和記憶化搜索里的dfs函數一樣。

這個數組表示的是從這個位置開始到n,m這個位置(符合題意的)的方案數

代碼如下:

#include<iostream>
#include<algorithm>
#include<cstring>using namespace std;
const int N=31;
int n,m;
int f[N][N];int main()
{scanf("%d%d",&n,&m);//dpfor(int i=n;i>0;i--){for(int j=m;j>0;j--){if(i%2==0&&j%2==0){continue;}int p=0;if(i==n&&j==m){p=1;}if(i<n) p+=f[i+1][j];if(j<m) p+=f[i][j+1];f[i][j]=p;}}cout<<f[1][1]<<endl;return 0;
}

總結

這就是從dfs分析到記憶化搜索再到dp的方法,如果有進一步想學習,可以多練習幾道題,主頁有幾道類似的題目分析,可以點贊收藏去看一看。

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

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

相關文章

Windows系統安裝python2025最新安裝包,包括環境配置,以及安裝python編程軟件PyCharm2024.3.3免費社區版本,詳細全流程

一、python安裝包安裝 1、python安裝包下載 瀏覽器打開官網&#xff0c;最好是谷歌瀏覽器 https://www.python.org/downloads/windows/ 下載安裝包&#xff08;注意處理器是32位還是64位&#xff09; 注意&#xff1a;下載完成后&#xff0c;找到安裝包并雙擊運行。在安裝向導…

【GPT入門】第3課 客服會話質檢(思維鏈)

【GPT入門】第3課 客服會話質檢 1.質檢任務2. 代碼3.核心 1.質檢任務 任務本質是檢查客服與用戶的對話是否有不合規的地方 質檢是電信運營商和金融券商大規模使用的一項技術 每個涉及到服務合規的檢查點稱為一個質檢項 我們選一個質檢項&#xff0c;產品信息準確性&#xff0…

ubuntu 20.04 C++ 源碼編譯 cuda版本 opencv4.5.0

前提條件是安裝好了cuda和cudnn 點擊下載&#xff1a; opencv_contrib4.5.0 opencv 4.5.0 解壓重命名后 進入opencv目錄&#xff0c;創建build目錄 “CUDA_ARCH_BIN ?” 這里要根據顯卡查詢一下,我的cuda是11&#xff0c;顯卡1650&#xff0c;所以是7.5 查詢方法1&#xff1…

K8s 1.27.1 實戰系列(四)驗證集群及應用部署測試

一、驗證集群可用性 1、檢查節點 kubectl get nodes ------------------------------------------------------ NAME STATUS ROLES AGE VERSION k8s-master Ready control-plane 3h48m v1.27.1 k8s-node1 Ready <none> …

【C++設計模式】第七篇:橋接模式(Bridge)

注意&#xff1a;復現代碼時&#xff0c;確保 VS2022 使用 C17/20 標準以支持現代特性。 抽象與實現的解耦之道 1. 模式定義與用途?? 核心思想? ?橋接模式&#xff1a;將抽象部分與實現部分分離&#xff0c;使二者可以獨立變化。?關鍵用途&#xff1a; ?1.拆分復雜繼承…

在 Spring Boot 2.7.x 中引入 Kafka-0.9 的實踐

文章目錄 在 Spring Boot 2.7.x 中引入 Kafka-0.9 的實踐一、下載 Kafka-0.9二、啟動 Zookeeper 和 Kafka三、創建 Spring Boot 項目四、引入 kafka 依賴五、移除 Kafka 自動配置六、編寫 Kafka 生產者6.1 Kafka配置類6.2 生產者監聽類 七、編寫Controller發送Kafka八、驗證消費…

字符串中的數字之和

題目描述 程序要求能夠提取輸入的字符串中的數字&#xff0c;將數字累加&#xff0c;得到數字之和&#xff0c;如輸入的字符串為"abc76wet23er1.",應該提取數字76,23,1,求和后&#xff0c;即76231100。 輸入格式: 輸入一個字符串&#xff0c;字符串長度不超過100.…

77.ObservableCollection使用介紹1 C#例子 WPF例子

可觀察集合ObservableCollection using System; using System.Collections.ObjectModel;class Program {static void Main(){// 創建一個可觀察集合ObservableCollection<string> list new ObservableCollection<string>();// 注冊集合變化事件list.CollectionCh…

ORACLE 執行查詢語句慢(不走對應索引)

1. 索引未被創建或未正確創建 確保為查詢中涉及的列創建了索引。例如&#xff0c;如果你經常需要按column_name列進行查詢&#xff0c;確保已經為該列創建了索引,索引創建語句 CREATE INDEX idx_column_name ON table_name(column_name); 2、索引不可用 原因:索引可能被標記為不…

r1-reasoning-rag:一種新的 RAG 思路

最近發現了一個開源項目&#xff0c;它提供了一種很好的 RAG 思路&#xff0c;它將 DeepSeek-R1 的推理能力結合 Agentic Workflow 應用于 RAG 檢索 項目地址 https://github.com/deansaco/r1-reasoning-rag.git 項目通過結合 DeepSeek-R1、Tavily 和 LangGraph&#xff0c;實現…

服務器硬件配置統計

服務器型號和SN # dmidecode -t system | grep -E "Product Name|Serial Number" | awk -F: {print $2} PowerEdge R7515 4567CPU型號和物理CPU數量 echo "$(lscpu | grep "Model name" | cut -d : -f2 | sed s/^ *//) x $(lscpu | grep "Soc…

Hadoop、Spark、Flink Shuffle對比

一、Hadoop的shuffle 前置知識&#xff1a; Map任務的數量由Hadoop框架自動計算&#xff0c;等于分片數量&#xff0c;等于輸入文件總大小 / 分片大小&#xff0c;分片大小為HDFS默認值128M&#xff0c;可調 Reduce任務數由用戶在作業提交時通過Job.setNumReduceTasks(int)設…

Docker的常用鏡像

Docker的常用鏡像命令主要包括鏡像的查看、搜索、拉取、刪除、構建等操作&#xff0c;以下是綜合多個來源的總結&#xff1a; 一、基礎鏡像操作 查看本地鏡像 docker images? 顯示所有本地鏡像&#xff0c;包含倉庫名&#xff08;REPOSITORY&#xff09;、標簽&#xff08;TAG…

車載以太網測試-3【Wireshark介紹】

1 摘要 Wireshark 是一款開源的網絡協議分析工具&#xff0c;廣泛用于網絡故障排查、協議分析、網絡安全檢測等領域。它能夠捕獲網絡數據包&#xff0c;并以詳細的、可讀的格式顯示這些數據包的內容。廣泛應用于車載網絡測試&#xff0c;是車載網絡測試工程師必須掌握的工具。…

基于跨模態地圖學習的視覺語言導航

前言 本工作開展的背景&#xff1a; 人類和其他物種構建類似地圖的環境表示來完成尋路&#xff1a; &#xff08;1&#xff09;當人類只使用現成的駕駛或步行路徑到達目標時&#xff0c;構建認知地圖和獲取空間知識的能力就會下降&#xff1b; &#xff08;2&#xff09;另…

nodejs關于后端服務開發的探究

前提 在當前的環境中關于web server的主流開發基本上都是java、php之類的&#xff0c;其中java spring系列基本上占了大頭&#xff0c;而python之流也在奮起直追&#xff0c;但別忘了nodejs也是可以做這個服務的&#xff0c;只是位置有點尷尬&#xff0c;現在就來探究下nodejs…

Ubuntu20.04本地配置IsaacGym Preview 4的G1訓練環境(一)

Ubuntu20.04本地配置IsaacGym Preview 4的G1訓練環境 配置conda虛擬環境安裝pytorch、cuda和cudnn安裝IsaacGym Preview 4配置rsl_rl配置unitree_rl_gym配置unitree_sdk2py 寫在前面&#xff0c;要求完成anaconda配置&#xff0c;若沒完成&#xff0c;請參考本人其余博客&#…

RangeError: Maximum call stack size exceeded

&#x1f90d; 前端開發工程師、技術日更博主、已過CET6 &#x1f368; 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 &#x1f560; 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》、《前端求職突破計劃》 &#x1f35a; 藍橋云課簽約作者、…

八卡5090服務器首發亮相!

AI 人工智能領域熱度居高不下。OpenAI 的 GPT - 4 憑強悍語言處理能力&#xff0c;在內容創作、智能客服等領域廣泛應用。清華大學團隊的 DeepSeek 大模型在深度學習訓練優勢突出&#xff0c;正促使各行業應用端算力需求向推理主導轉變&#xff0c;呈爆發式增長 。 隨著 DeepS…

計算機視覺|Swin Transformer:視覺 Transformer 的新方向

一、引言 在計算機視覺領域的發展歷程中&#xff0c;卷積神經網絡&#xff08;CNN&#xff09; 長期占據主導地位。從早期的 LeNet 到后來的 AlexNet、VGGNet、ResNet 等&#xff0c;CNN 在圖像分類、目標檢測、語義分割等任務中取得了顯著成果。然而&#xff0c;CNN 在捕捉全…