1. 程式人生 > >最小路徑和(dp基礎題)

最小路徑和(dp基礎題)

原題連結:https://leetcode-cn.com/problems/minimum-path-sum/description/

 

題目描述:

給定一個包含非負整數的 m x n 網格,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。

 

AC程式碼:

int min(int a,int b){
    return a<b?a:b;
}
int minPathSum(int** grid, int gridRowSize, int gridColSize) {
    int m=gridRowSize,n=gridColSize;
    int dp[n+5];
    for(int i=0;i<m;i++){
        for(int j=0;j<n;j++){
            if(i==0){
                if(j==0)
                    dp[j]=grid[i][j];
                else
                    dp[j]=dp[j-1]+grid[i][j];
            }
            else if(j==0){
                dp[j]+=grid[i][j];
            }
            else {
                dp[j]=min(dp[j],dp[j-1])+grid[i][j];
            }
        }
    }
    return dp[n-1];
}

 

思路大概就是初始化上邊界的節點,然後每個節點dp時搜尋上左兩節點就好

狀態轉移方程:dp[j]=min(dp[j],dp[j-1])+grid[i][j];

記憶體優化:每次遍歷時只用到上左節點,每次新的遍歷時,數組裡存放上層節點,所以從左到右遍歷,左邊界直接繼承上層節點,其他節點則狀態轉移;