藍橋杯算法雙周賽心得——迷宮逃脫(記憶化搜索)

大家好,我是晴天學長,非常經典實用的記憶化搜索題,當然也可以用dp做,我也會發dp的題解,需要的小伙伴可以關注支持一下哦!后續會繼續更新的。💪💪💪


1) .迷宮逃脫

在這里插入圖片描述
迷官逃脫[算法賽]
問題描述
在數學王國中,存在- -個大小為N x M的神秘迷言。第i行第j個位置坐標為(i,j),每個位置(i;,j) (1≤i≤N,1≤j≤M)都對應著一個正整數Aij。迷宮的左上角坐標為(1,1), 右下角坐標為(N,M)。
小藍初始位于坐標(1,1),并攜帶著Q把密匙。他的目標是移動到迷言的終點,即坐標(N, M)處。但是通往迷宮盡頭的道路并不是一-帆風順的, 在前進的過程中,他遇到了一些奇特的規則。

規則如下:

1.小藍每次只能向右移動一個位置或向下移動一個位置。
2.當小藍所在位置的數和下一步移動位置的數互質時,會有一扇封閉的鐵門, 小藍需要消耗-把密匙來打開鐵門,打開鐵門后,這把鑰匙將被摧毀。如果沒有密匙,小藍將無法移動到該位置。
你需要輸出小藍從起點到終點路徑之和的最大值,如果無法從起點到達終點,輸出-1

輸入格式

第一行輸入包含3個整數N, M, Q,分別為迷言的大小和密匙的數量。
接下來輸入N行,每行M個整數,為迷言上的數值。

輸出格式

輸出僅一-行,包含-個整數,表示管案。
樣例輸入

331
139
樣例輸出

28


2) .算法思路

逃脫迷宮(記憶化搜索)
1.使用快讀接受數據,矩陣大小從11開始,以及使用快輸。

2.從重點開始
1.出邊界或者要是為-1,就返回最小值
2.到達終點,返回矩陣。
3.記憶化中有就直接返回。
4.當前位置
可以走上面,也可以走下面,取最大值。
存在記憶化的矩陣中。
5.返回結果。


3).算法步驟

1.從第一行讀取輸入值 N、M 和 Q。
2.創建一個名為 “grid” 的二維數組,維度為 [1100][1100]。
3.讀取 N 行輸入,并使用這些值填充 grid 數組。
4.將變量 “ans” 初始化為 0。
5.使用參數 N、M、Q 和 grid 調用 dfs() 方法來計算最大和。
6.如果 “ans” 大于 0,則打印其值;否則,打印 -1。
7.刷新輸出流。

dfs() 方法執行實際的動態規劃計算。它以當前位置 (i, j)、剩余步數 (Q) 和網格作為輸入。它使用記憶化技術來存儲先前計算過的值,以避免重復計算。
dfs() 方法的步驟如下:

1)檢查基本情況:如果 i 或 j 等于 0,或者 Q 等于 -1,則返回 Long.MIN_VALUE。
2)檢查當前位置是否為目標位置(即 i = 1 且 j = 1)。如果是,則返回該位置的 grid 值。
3)檢查當前位置和剩余步數的結果是否已經被記憶化。如果是,則返回記憶化的結果。
4)根據當前值和左側值是否互質(最大公約數為 1)來計算 “floor” 值。
5)根據當前值和上方值是否互質來計算 “left” 值。
6)計算結果為當前值與兩個遞歸調用的最大值之和:向左移動(j 減 1)和向上移動(i 減 1)。
7)將結果進行記憶化。
8)返回結果。

gcd() 方法是一個輔助函數,使用歐幾里德算法計算兩個數的最大公約數。


4). 代碼實例

import java.io.*;public class Main {static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static String[] lines;static long[][][] memo = new long[1100][1100][4];static long ans = 0;public static void main(String[] args) throws IOException {lines = in.readLine().split(" ");int N = Integer.parseInt(lines[0]);int M = Integer.parseInt(lines[1]);int Q = Integer.parseInt(lines[2]);long[][] grid = new long[1100][1100];//接受數據for (int i = 1; i <= N; i++) {lines = in.readLine().split(" ");for (int j = 1; j <= M; j++) {grid[i][j] = Integer.parseInt(lines[j - 1]);}}// 開始ans = dfs(N, M, Q, grid);out.println(ans <= 0 ? -1 : ans);out.flush();}private static long dfs(int i, int j, int Q, long[][] grid) {if (i == 0 || j == 0 || Q == -1) return Long.MIN_VALUE;if (i == 1 && j == 1) return grid[i][j];//緩存的值if (memo[i][j][Q]!=0) return memo[i][j][Q];//從上面走,先判斷是否互質int floor = gcd((int) grid[i][j], (int) grid[i][j - 1]) == 1 ? 1 : 0;//從左面走int left = gcd((int) grid[i][j], (int) grid[i - 1][j]) == 1 ? 1 : 0;//取最大long result = grid[i][j] + Math.max(dfs(i, j - 1, Q - floor, grid), dfs(i - 1, j, Q - left, grid));memo[i][j][Q] = result;return result;}//求是否互質private static int gcd(int a, int b) {return b == 0 ? a : gcd(b, a % b);}
}

4).總結

  • 以后建議都用快讀快輸,不用只過60%,而且這兩個還要一起用,只用快讀只過95%!!

試題鏈接:

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

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

相關文章

ubuntu操作系統中docker下Hadoop分布式前置環境配置實驗

版本&#xff1a; centos7 hadoop 3.1.3 java JDK:1.8 集群規劃&#xff1a; masterslave1slave2HDFS NameNode DataNode DataNode SecondryNameNode DataNode YARNNodeManager ResourceManage NodeManager NodeManager 1.docker容器&#xff1a; 把普通用戶加入到docker組&am…

opencv-Canny 邊緣檢測

Canny邊緣檢測是一種經典的圖像邊緣檢測算法&#xff0c;它在圖像中找到強度梯度的變化&#xff0c;從而識別出圖像中的邊緣。Canny邊緣檢測的優點包括高靈敏度和低誤檢率。 在OpenCV中&#xff0c;cv2.Canny() 函數用于執行Canny邊緣檢測。 基本語法如下&#xff1a; edges…

代碼隨想錄 134. 加油站

題目 在一條環路上有 n 個加油站&#xff0c;其中第 i 個加油站有汽油 gas[i] 升。 你有一輛油箱容量無限的的汽車&#xff0c;從第 i 個加油站開往第 i1 個加油站需要消耗汽油 cost[i] 升。你從其中的一個加油站出發&#xff0c;開始時油箱為空。 給定兩個整數數組 gas 和 cos…

本地訓練,開箱可用,Bert-VITS2 V2.0.2版本本地基于現有數據集訓練(原神刻晴)

按照固有思維方式&#xff0c;深度學習的訓練環節應該在云端&#xff0c;畢竟本地硬件條件有限。但事實上&#xff0c;在語音識別和自然語言處理層面&#xff0c;即使相對較少的數據量也可以訓練出高性能的模型&#xff0c;對于預算有限的同學們來說&#xff0c;也沒必要花冤枉…

阿里云 ACK 新升級,打造智算時代的現代化應用平臺

云布道師 今天&#xff0c;能想到的或是想不到的領域&#xff0c;對容器和 Kubernetes 的需求都居高不減&#xff0c;使這項技術正在真正走向無處不在。 在 2023 云棲大會上&#xff0c;阿里云云原生產品線容器服務負責人易立關于容器服務 ACK 在本屆亞運會上應用的介紹&#…

[crash] cxa_pure_virtual 崩潰分析與原理

摘要&#xff1a;工作過程中處理線上的崩潰時發現了一例cxa_pure_virtual相關的crash&#xff0c;直接看堆棧基本山很容易確認是有異步調用導致出發了ABI的異常。但是對于為什么會觸發cxa_pure_virtual雖然有大致的猜測但是沒有直接的證據&#xff0c;因此本文主要描述觸發該類…

C/C++未定義行為的例子匯總

一、什么是未定義行為&#xff1f; 未定義行為&#xff08;Undefined Behavior&#xff09;是指C語言標準未做規定的行為。同時&#xff0c;標準也從沒要求編譯器判斷未定義行為&#xff0c;所以這些行為有編譯器自行處理&#xff0c;在不同的編譯器可能會產生不同的結果&#…

ElasticSearch之cat aliases API

執行aliases命令&#xff0c;如下&#xff1a; curl -X GET "https://localhost:9200/_cat/aliases?pretty&vtrue" --cacert $ES_HOME/config/certs/http_ca.crt -u "elastic:ohCxPHQBEs5*lo7F9"執行結果輸出如下&#xff1a; alias index …

在 VSCode 中使用 GDB 進行 C/C++ 程序調試(圖文版)

(??? )&#xff0c;Hello我是祐言QAQ我的博客主頁&#xff1a;C/C語言&#xff0c;數據結構&#xff0c;Linux基礎&#xff0c;ARM開發板&#xff0c;網絡編程等領域UP&#x1f30d;快上&#x1f698;&#xff0c;一起學習&#xff0c;讓我們成為一個強大的攻城獅&#xff0…

webpack loader

1、分類 2、執行順序 配置類型 執行順序是 loader1>loader2>loader3 3、使用方式 自己的第一個loader 同步loader /*** loader 就是一個函數* 當webpack 解釋資源時&#xff0c; 會調用相應的loader去處理* loader 接收到文件內容作為參數&#xff0c;返回文件內容* p…

Nginx 開源版安裝

下載 tar.gz安裝包&#xff0c;上傳。 解壓 [rootlocalhost ~]# tar zxvf nginx-1.21.6.tar.gz nginx-1.21.6/ nginx-1.21.6/auto/ nginx-1.21.6/conf/ nginx-1.21.6/contrib/ nginx-1.21.6/src/ ... ...安裝gcc [rootlocalhost nginx-1.21.6]# yum install -y gcc 已加載插件…

ios qt開發要點

目前關于ios qt的開發資料比較少&#xff0c;這里整理了幾個比較重要的開發要點&#xff0c;基于MacOS14 Xcode15 Qt15.5 cmake iphone真機。 cmake報錯&#xff0c;報錯信息如下 CMake Error at /Users/user/Qt/5.15.5/ios/lib/cmake/Qt5Core/Qt5CoreConfig.cmake:91 (m…

C#Wpf關于日志的相關功能擴展

目錄 一、日志Sink(接收器) 二、Trace追蹤實現日志 三、日志滾動 一、日志Sink(接收器) 安裝NuGet包&#xff1a;Serilog Sink有很多種&#xff0c;這里介紹兩種&#xff1a; Console接收器&#xff08;安裝Serilog.Sinks.Console&#xff09;; File接收器&#xff08;安裝…

CSM32RV003:國產高精度16位ADC低功耗RISC-V內核MCU

目錄 高精度ADC工業應用工業數據采集應用CSM32RV003簡介主要特性 高精度ADC工業應用 高精度ADC即高精度模數轉換器&#xff0c;是一種能夠將輸入模擬信號轉換為數字信號的芯片&#xff0c;在多種消費電子、工業、醫療和科研領域都有廣泛應用。高精度ADC的主要特點是能夠提供高…

深度學習圖像修復算法 - opencv python 機器視覺 計算機競賽

文章目錄 0 前言2 什么是圖像內容填充修復3 原理分析3.1 第一步&#xff1a;將圖像理解為一個概率分布的樣本3.2 補全圖像 3.3 快速生成假圖像3.4 生成對抗網絡(Generative Adversarial Net, GAN) 的架構3.5 使用G(z)生成偽圖像 4 在Tensorflow上構建DCGANs最后 0 前言 &#…

前端 HTML 的 DOM 事件相關知識有哪些?

HTML 的 DOM 事件是指在網頁上發生的各種事件&#xff0c;如點擊、鼠標移動、鍵盤輸入等。 通過 JavaScript 腳本可以對這些事件進行監聽和處理&#xff0c;以實現交互效果。以下是一些常見的 DOM 事件及其相關知識點&#xff1a; 1、click&#xff1a;點擊事件&#xff0c;在…

vue3引入vuex基礎

一&#xff1a;前言 使用 vuex 可以方便我們對數據的統一化管理&#xff0c;便于各組件間數據的傳遞&#xff0c;定義一個全局對象&#xff0c;在多組件之間進行維護更新。因此&#xff0c;vuex 是在項目開發中很重要的一個部分。接下來讓我們一起來看看如何使用 vuex 吧&#…

linux文件I/O:文件鎖的概念、函數以及代碼實現

文件鎖是一種用來保證多個進程對同一個文件的安全訪問的機制。文件鎖可以分為兩種類型&#xff1a;建議性鎖和強制性鎖。建議性鎖是一種協作式的鎖&#xff0c;它只有在所有參與的進程都遵守鎖的規則時才有效。強制性鎖是一種強制式的鎖&#xff0c;它由內核或文件系統來強制執…

使用Pytorch從零開始構建RNN

在這篇文章中&#xff0c;我們將了解 RNN&#xff08;即循環神經網絡&#xff09;&#xff0c;并嘗試通過 PyTorch 從頭開始??實現其中的部分內容。是的&#xff0c;這并不完全是從頭開始&#xff0c;因為我們仍然依賴 PyTorch autograd 來計算梯度并實現反向傳播&#xff0c…

Apache訪問控制

服務器相關的訪問控制 Options指令 Options指令是Apache服務器配置文件中的一個重要指令,它可以用于控制特定目錄啟用哪些服務器特性。Options指令可以在Apache服務器的核心配置、虛擬主機配置、特定目錄配置以及.htaccess文件中使用。 以下是一些常用的服務器特性選項: N…