日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【常见笔试面试算法题12续集二】动态规划算法案例2矩阵最小路径和练习题

發布時間:2023/12/10 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【常见笔试面试算法题12续集二】动态规划算法案例2矩阵最小路径和练习题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

加qq1126137994 一起學習更多技術!!!

有一個矩陣map,它每個格子有一個權值。從左上角的格子開始每次只能向右或者向下走,最后到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。

給定一個矩陣map及它的行數n和列數m,請返回最小路徑和。保證行列數均小于等于100.

測試樣例:
[[1,2,3],[1,1,1]],2,3
返回:4

分析
假設矩陣m的大小為M*N,行數為M,列數為N,生成大小和m一樣的矩陣dp,行數為M,列數為N,dp[i][j]的值等于m矩陣從左上角,也就是(0,0)
走到(i,j)位置的最小路徑和。

第一行與第一列,通常都是可以通過一個循環求出來的:
第一行的值:只能是從左往右走,路徑最小值為前一個方格的路徑最小值加上本方格所對應的權值,即dp[0][j] = dp[0][j-1]+m[i][j]
第一列的值:只能是從上往下走,路徑最小值為上一個方格的路徑最小值加上本方格所對應的權值;即dp[i][0] = dp[i-1][0]+m[i][j]

那么除了第一行和第一列的值,其他部分的值為(只能是從上面過來,或者從左邊過來):

最終,右下角的值,就為我們所要求的值:

實現代碼如下:

class MinimumPath { public:int R_min(int m,int n){if(m>=n)return n;elsereturn m;}int getMin(vector<vector<int> > map, int n, int m) {// write code here//額外開辟一個dp矩陣,并將dp矩陣所有值初始化為0vector<vector<int> > dp(n,vector<int>(m,0));//矩陣的第一個空格的值就等于map矩陣的第一個值的本身dp[0][0]= map[0][0];//先求第一行的值for(int j=1;j<m;j++){dp[0][j] = dp[0][j-1] + map[0][j];}//再求第一列的值for(int i=1;i<n;i++){dp[i][0] = dp[i-1][0] + map[i][0];}//最后求其他行的值for(int i=1;i<n;i++){for(int j=1;j<m;j++){dp[i][j]=R_min(dp[i-1][j]+map[i][j],dp[i][j-1]+map[i][j]);}}return dp[n-1][m-1];} };

以上程序,求兩個數的最小值并返回是可以不寫的。可以直接用庫函數min();但是我是因為不熟悉C++的庫函數,所以自己寫了一個,影響不大!!!

以上的分析思路,依然是:先解決子問題!!!何為子問題?就是我們把所要求的整體的問題,化簡到最簡單的情況,比如,上面的題,我們要求走到最右下角的路徑的最小值,那么我們就化簡,化簡到,整個矩陣為1個方格,2個方格,3個方格,4個方格…… 時的最短路徑的求解,然后,前面的子問題求出來了,我們會發現,通過前面子問題的整合,可以求得整體問題,也就是最終,我們可以求得最右下角的值,這也避免了,很多的重復計算,更加避免了遞歸所帶來的復雜的運算順序!!!

總結

以上是生活随笔為你收集整理的【常见笔试面试算法题12续集二】动态规划算法案例2矩阵最小路径和练习题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。