最小路徑和(dp基礎題)
阿新 • • 發佈:2018-11-09
原題連結: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];
記憶體優化:每次遍歷時只用到上左節點,每次新的遍歷時,數組裡存放上層節點,所以從左到右遍歷,左邊界直接繼承上層節點,其他節點則狀態轉移;