1. 程式人生 > >矩陣最短路徑和

矩陣最短路徑和

程式設計師面試指南中的一個題目:

        給定一個矩陣m,從左上角開始每次只能向右或向下走,最後達到右下角的位置,路徑上所有數字的累加和就是路徑和,求所有路徑中的最小路徑和。

        根據動態規劃實現,構建矩陣dp,dp[i][j]為從左上角(0,0)到(i,j)的最小路徑和。對於第一行,只能向右累加;對於第一列,只能向下累加。其他位置都是從其左側或上面的點中選擇較小的值再加上該節點的值,即dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + m[i][j]。最後右下角的值就是最小路徑和。

C++實現如下:

#define MIN(x,y) ((x) <= (y) ? (x) : (y))
int getMinPath(int **Matrix, int row, int column)
{
    if (NULL == Matrix)
    {
        return 0;
    }

    int **dp = new int*[row];
    for (int i = 0; i < row; i++)
    {
        dp[i] = new int[column];
    }

    // 注意二維陣列引數的處理
    //dp[0][0] = Matrix[0][0];
    dp[0][0] = *((int*)Matrix);

    for (int i = 1; i < column; i++)
    {
        //dp[0][i] = dp[0][i - 1] + Matrix[0][i];
        dp[0][i] = dp[0][i - 1] + *((int*)Matrix + i);
    }
    for (int i = 1; i < row; i++)
    {
        //dp[i][0] = dp[i - 1][0] + Matrix[i][0];
        dp[i][0] = dp[i - 1][0] + *((int*)Matrix + column*i);
    }

    for (int i = 1;i < row; i ++)
    {
        for (int j = 1; j < column; j++)
        {
            //dp[i][j] = MIN(dp[i][j - 1], dp[i - 1][j]) + Matrix[i][j];
            dp[i][j] = MIN(dp[i][j - 1], dp[i - 1][j]) + *((int*)Matrix + column*i + j);
        }
    }

    int result = dp[row - 1][column - 1];

    for (int i = 0; i < row; i++)
    {
        delete[] dp[i];
        dp[i] = NULL;
    }

    delete[] dp;
    dp = NULL;

    return result;
}
int main(int argc, char* argv[])
{

    int Matrix[4][4] = {{1,3,5,9},{8,1,3,4},{5,0,6,1},{8,8,4,0}};
    // 注意二維陣列作為函式引數的處理方式
    printf("Min path is %d\n", getMinPath((int**)Matrix,4,4));
    return 0;
}
        這裡要注意二維陣列作為函式引數的處理方式,除了上述方式外,還有其他方式,但都需要傳遞列數,可以再學習一下。

相關推薦

矩陣路徑

程式設計師面試指南中的一個題目:         給定一個矩陣m,從左上角開始每次只能向右或向下走,最後達到右下角的位置,路徑上所有數字的累加和就是路徑和,求所有路徑中的最小路徑和。         根據動態規劃實現,構建矩陣dp,dp[i][j]為從左上角(0,0)到(i

矩陣路徑

題目: 給定一個矩陣m,從左上角開始每次只能向右或者向下走,最後到達右下角的為止,路徑上所有的數字累加起來就是路徑和,返回所有路徑中的最小的路徑和。 舉例: 1 3 5 9 8 1 3 4 5

筆試面試演算法經典--矩陣路徑(Java)

題目 給定一個矩陣m,從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有路徑中最小的路徑和。 例子: 給定m如下: 1 3 5 9 8

用棧 求迷宮問題(路徑全部路徑

這是資料結構的作業,便找書邊看網上,然後自己慢慢寫出來的,這裡面主要是回溯法。 因為課本上是打印出一條路徑,然後我在想怎樣能將所有的路徑都輸出來,方法:就是當求出一條路徑後,將出口點變成可以走的點(因為之前將其值變成了-1),並且將棧頂元素出棧,還需要得到現在棧頂元素的i,j

Dijkstra求短路的條數,並輸出路徑短路經過的點的

#include <cstdio> #include <algorithm> #include <iostream> #include <cstring> #include <stack> using name

圖論經典演算法(通俗易懂):路徑小生成樹

一、最短路問題 求圖的最短路問題,幾乎是圖論的必學內容,而且在演算法分析與設計中也會涉及。很多書上內容, 實在沒法看,我們的圖論教材,更是編的非常糟糕,吐槽,為啥要用自己學校編的破教材,不過據說 下一屆終於要換書了。 言歸正傳,開始說明最短路問題。

【經典動態規劃問題】矩陣路徑問題

題目內容: 有一個矩陣map,它每個格子有一個權值。從左上角的格子開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。 給定一個矩陣map及它的行數n和列數m,請返回最小路徑和。保證行列數均小於等於100. 測試樣例:

動態規劃-矩陣路徑

題目描述 有一個矩陣map,它每個格子有一個權值。 從左上角的格子開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和。 返回所有的路徑中最小的路徑和。 給定一個矩陣map及它的行數n和列數m,請返回最小路徑和。 求解過程 給定一個N*M的矩

演算法學習——動態規劃 例題:矩陣路徑(java)

給定一個矩陣m,從左上角開始每次只能向右或者向下走,最後到達右下角的位置, 路徑上所有的數字累加起來就是路徑的和,返回所有的路徑中的最小的路徑的和。 如果給定的m如大家看到的樣子,路徑1,3,1,0,6,1,0是所有路徑中路徑和最小的,所以返回12. 1 3 5 9 8 1 3 4 5 0 6 1

牛刀小試一:矩陣路徑

題目: 給定一個M×N的矩陣,定義一條路徑為:從矩陣左上頂點數字出發到達右下數字,每一次只可以從一個數字出發向右移動一步或向下移動一步,定義路徑和為:路徑經過的數字的和。要求編寫一個程式,找到路徑和最小的那條路徑,並給出最小路徑和。 給定如圖所示矩陣:一條路徑為2->

動態規劃3:矩陣路徑問題

題目:有一個矩陣map,它每個格子有一個權值。從左上角的格子開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的數字累加起來就是路徑和,返回所有的路徑中最小的路徑和。 給定一個矩陣map及它的行數n和列數m,請返回最小路徑和。保證行列數均小於等於100. 測試樣例

動態規劃--矩陣路徑

int min(int a, int b) { if (a < b) return a; else return b; } int getMin(vector<vector<int> > map, int

C++求矩陣路徑進階方法空間複雜度O(min {row, col})

#include <iostream> int minPathSum_pro(const int(*pArr) [10], const int &row, const int &col); int main() {int row = 0, col

路徑

class Solution { public:     /*      * @param grid: a list of lists of integers      * @return: An integer, minimizes the sum of all numbers along its pat

圖的路徑拓撲排序

圖的最短路徑 從某頂點出發,沿圖的邊到達另一頂點所經過的路徑中,各邊上權值之和最小的一條路徑叫做最短路徑 圖的最短路徑有許多重要的應用。 例如:上圖中v0-v8有9個點,可以看做不同的地點,現在要規劃出v0到其它某個點地點的最短路線規劃 構建最短路徑中比較常見的一種演算

【算法】Dijkstra算法(單源路徑問題) 鄰接矩陣鄰接表實現

當前 prior 排序 發的 單源最短路徑 fine emp eat col Dijkstra算法可使用的前提:不存在負圈。 負圈:負圈又稱負環,就是說一個全部由負權的邊組成的環,這樣的話不存在最短路,因為每在環中轉一圈路徑總長就會邊小。 算法描述:   1.找到最

更多路徑相關的問題

one 實現 路徑問題 拓撲 使用 基本 -1 沒有 結構 -------------------siwuxie095 更多和最短路徑相關的問題 在《算法導論》中,關於 Dijkstra 算

[DP]矩陣路徑

其他 局限性 == vector ++ span table 獲得 方程 題目 給定一個矩陣m, 從左上角開始每次只能向右或者向下走,最後到達右下角的位置,路徑上所有的樹子累加起來就是路徑和,返回所有的路徑中最小的路徑和. 解法一 這是一道經典的動態規劃題,狀態轉移方程為d

矩陣路徑

width [] || tab return public 一個 sta println 給你一個數組,求從[0,0]位置到[n-1,m-1]的最短路徑。 數組如圖所示: 1 3 5 9 8 2 3 4 5 0 6 1 8 8 4 0 路

51nod 1443 路徑樹(單元路徑)

std algo 技術分享 mage 它的 ont cst 3-9 while 分析:很容易想到先搞一遍單源最短路徑,然後只保留最短路徑上的邊,接下來容易想到最小生成樹,但是因為有的邊只刪了一個方向,所以變成了有向圖了,要求的就是最小樹形圖,比較麻煩而且容易T。。。 實際