【常见笔试面试算法题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矩阵最小路径和练习题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 闪电模型数学_最经典的数学模型
- 下一篇: python音乐爬虫_Python爬虫实