動態規劃|【路徑問題】|931.下降路徑最小和

目錄

題目

題目解析

思路

1.狀態表示

2.狀態轉移方程

3.初始化

4.填表順序

5.返回值

代碼


題目

931. 下降路徑最小和

給你一個?n x n?的?方形?整數數組?matrix?,請你找出并返回通過?matrix?的下降路徑??最小和?。

下降路徑?可以從第一行中的任何元素開始,并從每一行中選擇一個元素。在下一行選擇的元素和當前行所選元素最多相隔一列(即位于正下方或者沿對角線向左或者向右的第一個元素)。具體來說,位置?(row, col)?的下一個元素應當是?(row + 1, col - 1)(row + 1, col)?或者?(row + 1, col + 1)?。

示例 1:

輸入:matrix = [[2,1,3],[6,5,4],[7,8,9]]
輸出:13
解釋:如圖所示,為和最小的兩條下降路徑

示例 2:

輸入:matrix = [[-19,57],[-40,-5]]
輸出:-59
解釋:如圖所示,為和最小的下降路徑

提示:

  • n == matrix.length == matrix[i].length
  • 1 <= n <= 100
  • -100 <= matrix[i][j] <= 100

題目解析

????????題目是給一個n*n的矩陣,矩陣里面有值,從第一行到最后一行,所走過的最小值,從第一行元素的任意一個開始,往最后一行走 ,既然是最小值,那沒每次就要挑下一行的最小值走,,而這個不是隨便挑的,是以第一行這個位置,在第二行離的最近的三個位置中跳最小的值,圖示如下圖。

????????如果第一行從1開始走,那么第二行,只能走6,5或者4。每走一步加上該位置的值就行,根據規則走到最后 一行 就算結束,返回最小的那個就行。如果是邊界,也就是只有兩個位置離它最近。

思路

1.狀態表示

????????狀態表示,我們還是選用最常用的方法——選用以某一個位置為結尾,也就是從第一行走到該位置,題目要求,最小路徑,所以狀態表示可以看成dp[i][j]——從開始走到該【i,j】位置的最小的下降路徑

2.狀態轉移方程

????????根據最近的一步劃分路徑,最近的路徑,到達【i,j】位置,可以從【i-1,j-1】位置,【i-1,j】或者【i-1,j+1】位置到達,所以應當分三種情況討論。

a)從【i-1,j-1】位置到達【i,j】位置

????????要得到第一行到【i,j】位置的最小路徑,就要得到第一行到【i-1,j-1】的最小路徑,然后加上【i-1,j-1】位置上面的值就是,第一行到【i,j】位置的最小值。而第一行到【i-1,j-1】位置的最小路徑可以用dp[i-1][j-1]表示,

????????所以此情況下的狀態轉移方程就是dp[i][j]=dp[i-1][j-1]+matrix[i-1][j-1]

b)從【i-1,j】位置到達【i,j】位置

????????同理,得到這個狀態轉移方程dp[i][j]=dp[i-1][j]+matrix[i-1][j]

c)從【i-1,j+1】位置到達【i,j】位置

????????同理,得到這個狀態轉移方程dp[i][j]=dp[i-1][j+1]+matrix[i-1][j+1]

然后取這三種情況的最小值。

3.初始化

????????初始化是為了讓填表的時候不要越界。我們要算第一行到指定位置的路徑最小值,也就是算dp[i][j],根據狀態轉移方程可以看出要算dp[i][j],要先得到dp[i-1][j],dp[i-1][j-1],dp[i-1][j+1],第一行和第一列和最后一列,這三個位置是不全的,所以要初始化第一行和第一列,最后一列的位置。

????????之前學過,虛擬節點的方式,把需要的位置補起來,填上能使結果正確的值就行,補虛擬結點的方式,如下圖所示。

????????現在要確定里面要填什么值,才能使結果正確,我們先來看不加虛擬結點的時候那里面應該填什么?

????????對于第一行,比如:dp[0][0],dp[0][0]表示從第一行到當前位置的最小值,可以看出當前位置就是在第一行,也就是自己到自己,也就等于本身矩陣里面的值,這樣 我們將加的第一行虛擬結點賦值為0就可以不影響結果。

????????對于第一列和最后一列,對于第一列,從第二行開始,它們只是缺了左上角那個數,其他兩個都在,如果不加虛擬結點,也就是說只在這兩個結點里面挑一個最小的加上就行,也就是說 虛擬結點里面的值不能影響dp[i][j]的結果 ,虛擬結點里面的值要比其他兩個值都大,為了確保起見,應該將虛擬結點賦值為正的無窮大。

????????我們加完之后,還要解決下標映射的問題加了一行,所以就 整體向下挪了一行,左邊增加一列,也就是向右挪了一列。

????????所以當我們算dp[1][1]的值我們要用martix[0][0]值來計算。

4.填表順序

填表順序,還是從上到下,從左到右

5.返回值

因為是要到達最后一行,并且是要最小值,所以我們返回dp表中最后一行的最小值就行

代碼

????????初始化技巧:我們為了方便初始化,如果我們在定義dp表時,將所有值定義為0,后面初始化的時候要改兩列的值,所以這里可以我們一開始就將每個初始化正的無窮大。

int min(int a,int b)
{return (a<b)?a:b;
}
int minFallingPathSum(int** matrix, int matrixSize, int* matrixColSize)
{int nummin=INT_MAX;int n=matrixColSize[0];//創建一個dp表int dp[102][102]={INT_MAX};//初始化for(int i=0;i<102;i++)for(int j=0;j<102;j++){dp[i][j]=INT_MAX;}for(int j=0;j<n+2;j++)dp[0][j]=0;//填表 for(int i=1;i<=n;i++){for(int j=1;j<=n;j++){dp[i][j]=min(   min(dp[i-1][j],dp[i-1][j-1])  ,   dp[i-1][j+1]   )   +matrix[i-1][j-1];}}for(int j=1;j<=n;j++){nummin=min(nummin,dp[n][j]);}return nummin;
}

空間復雜度:O(n^{2})

時間復雜度:O(n^{2})

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

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

相關文章

【Vue3】Props的使用詳解

&#x1f497;&#x1f497;&#x1f497;歡迎來到我的博客&#xff0c;你將找到有關如何使用技術解決問題的文章&#xff0c;也會找到某個技術的學習路線。無論你是何種職業&#xff0c;我都希望我的博客對你有所幫助。最后不要忘記訂閱我的博客以獲取最新文章&#xff0c;也歡…

概率基礎——多元正態分布

概率基礎——多元正態分布 介紹 多元正態分布是統計學中一種重要的多維概率分布&#xff0c;描述了多個隨機變量的聯合分布。在多元正態分布中&#xff0c;每個隨機變量都服從正態分布&#xff0c;且不同隨機變量之間可能存在相關性。本文將以二元標準正態分布為例&#xff0…

多線程JUC 第2季 中斷線程

一 中斷線程 1.1 中斷概念 1.在java中&#xff0c;沒有提供一種立即停止一條線程。但卻給了停止線程的協商機制-中斷。 中斷是一種協商機制。中斷的過程完全需要程序員自己實現。也即&#xff0c;如果要中斷一個線程&#xff0c;你需要手動調用該線程的interrupt()方法&…

錄制用戶操作實現自動化任務

先上視頻&#xff01;&#xff01; 流程自動化工具-錄制操作繪制流程 這個想法之前就有了&#xff0c;趁著周末時間給它擼出來。 實現思路 從之前的文章自動化桌面未來展望中已經驗證了錄制繪制流程圖的可行性。基于DOM錄制頁面操作軌跡的思路監聽頁面點擊、輸入事件即可&…

無人機鏡頭穩定的原理和相關算法

無人機的鏡頭穩定主要基于兩個關鍵技術&#xff1a;鏡頭平衡技術和實時電子穩像。無人機鏡頭穩定的原理和相關算法主要是通過鏡頭平衡技術和實時電子穩像技術來保持攝像鏡頭的穩定性&#xff0c;從而拍攝出清晰、穩定的畫面。無人機鏡頭穩定的原理主要是通過傳感器和算法來實現…

Ocr之PaddleOcr模型訓練

目錄 一、系統環境 1 鏡像拉取ppocr 進行部署 2 安裝paddlepaddle 二、訓練前的準備 1 下載源碼 2 預模型下載 3 修改模型訓練文件yml 4 編排訓練集 5 執行腳本進行訓練 6 需要修改文件夾名稱 三、開始訓練 1 執行訓練命令 2 對第一次評估進行解釋 3 引言 五、總…

NestJS使用模板引擎ejs

模板引擎? 模板引擎是一種用于生成動態內容的工具&#xff0c;它通過將預定義的模板與特定數據結合&#xff0c;來生成最終的輸出。? 在NodeJS開發中&#xff0c;我們會使用模板引擎來渲染一些常用的頁面&#xff0c;比如渲染代表404的Not Found 頁面&#xff0c;502的Bad …

異常值檢測-值域法 頭歌代碼解釋

這關做得不是很明白&#xff0c;如果有清楚的同志可以在評論區里面討論 import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.neighbors import LocalOutlierFactor # 導入數據 abc pd.read_csv(deaths.csv) ## 只分析其中的Population和L…

C語言對類型的轉換

C語言對類型的轉換 文章目錄 C語言對類型的轉換整形提升和截斷整形提升整形提升規則整形提升的意義 截斷截斷規則 算數轉換 我們都知道&#xff0c;C語言中內置了多種整形類型&#xff0c;占用空間從大到小&#xff0c;基本滿足各類使用場景&#xff08;比如超長數字的運算就不…

【【C語言簡單小題學習-1】】

實現九九乘法表 // 輸出乘法口訣表 int main() {int i 0;int j 0;for (i 1; i < 9; i){for (j 1; j < i;j)printf("%d*%d%d ", i , j, i*j);printf("\n"); }return 0; }猜數字的游戲設計 #define _CRT_SECURE_NO_WARNINGS 1 #include<stdi…

源碼視角,vue3為什么推薦用ref,而不是reactive

ref 和 reactive 是 Vue3 中實現響應式數據的核心 API。ref 用于包裝基本數據類型&#xff0c;而 reactive 用于處理對象和數組。盡管 reactive 似乎更適合處理對象&#xff0c;但 Vue3 官方文檔更推薦使用 ref。 我的想法&#xff0c;ref就是比reactive好用&#xff0c;官方也…

Java 中對包含關系的判斷

本文將為您詳細講解 Java 中對包含關系的判斷&#xff0c;包括數組、字符串等&#xff0c;并提供相應的代碼例子。 1. 數組包含關系判斷 在 Java 中&#xff0c;數組包含關系判斷通常使用循環來實現。以下是幾種常見的判斷方法&#xff1a; 示例 1&#xff1a;使用 for…

Unity曲柄滑塊四桿機構運動計算

一、運動效果 二、機構的介紹 曲柄長度&#xff1a;a&#xff0c;線段AB長度 連桿長度&#xff1a;b&#xff0c;線段BC長度 偏心距離&#xff1a;e&#xff0c;滑塊軌跡與曲柄中心點A的垂直距離 三、已知點A點B和e的值&#xff0c;計算C點的位置 1、計算s的值 var h math.…

通過多進程并發方式(fork)實現服務器(注意要回收子進程)

以下內容為視頻學習記錄。 1、父進程accept后返回的文件描述符為cfd以及用于創建連接的lfd; 調用fork()創建子進程后&#xff0c;子進程繼承cfd,lfd&#xff0c;通過該cfd與連接過來的客戶端通信,lfd對子進程來說沒用&#xff0c;可以直接close(lfd); 對于父進程來說&#x…

雙非二本找實習前的準備day4

學習目標&#xff1a; 每天2-3到簡單sql&#xff08;刷完即止&#xff09;&#xff0c;每天復習代碼隨想錄上的題目3道算法&#xff08;時間充足可以繼續&#xff09;&#xff0c;背誦的八股的問題也在這里記錄了 今日碎碎念&#xff1a; 1&#xff09;偶爾還是貪玩游戲&…

Vue中的計算屬性和方法有什么區別?

Vue.js是一款流行的JavaScript前端框架&#xff0c;提供了豐富的功能和便捷的開發方式。在Vue中&#xff0c;計算屬性和方法是常用的兩種方式來處理數據和邏輯。但它們之間存在一些區別&#xff0c;本文將詳細介紹Vue中計算屬性和方法的區別&#xff0c;并通過示例代碼加深理解…

183896-00-6,Biotin-C3-PEG3-C3-NH2,可以選擇性降解靶蛋白

您好&#xff0c;歡迎來到新研之家 文章關鍵詞&#xff1a;183896-00-6&#xff0c;Biotin-C3-PEG3-C3-NH2&#xff0c;Biotin-C3-PEG3-C3-amine&#xff0c;生物素-C3-PEG3-C3-胺 一、基本信息 【產品簡介】&#xff1a;Biotin-PEG3-C3-NH2是一種PROTAC linker&#xff0c;…

381. 有線電視網絡(網絡流,最小割,《算法競賽進階指南》)

381. 有線電視網絡 - AcWing題庫 給定一張 n 個點 m 條邊的無向圖&#xff0c;求最少去掉多少個點&#xff0c;可以使圖不連通。 如果不管去掉多少個點&#xff0c;都無法使原圖不連通&#xff0c;則直接返回 n。 輸入格式 輸入包含多組測試數據。 每組數據占一行&#xf…

Python推導式大全與實戰:精通列表、字典、集合和生成器推導式【第115篇—python:推導式】

Python推導式大全與實戰&#xff1a;精通列表、字典、集合和生成器推導式 Python語言以其簡潔、優雅的語法而聞名&#xff0c;其中推導式是其獨特之處之一。推導式是一種在一行代碼中構建數據結構的強大方式&#xff0c;它涵蓋了列表、字典、集合和生成器。本篇博客將全面介紹…

YOLOv8實例分割實戰:ONNX模型轉換及TensorRT部署

課程鏈接&#xff1a;https://edu.csdn.net/course/detail/39320 PyTorch版的YOLOv8支持高性能的實時實例分割。 TensorRT是針對英偉達GPU的加速工具。 ONNX &#xff08;Open Neural Network Exchange&#xff09; 作為一個開放的網絡模型中間表示&#xff08;IR&#xff0…