Minimum Path Sum
Minimum sum from top-left to bottom-right moving right/down — 1D rolling DP.
3 min read
dp grid
Problem#
Min sum of a path from (0,0) to (m-1,n-1) moving only right or down.
Examples#
[[1,3,1],[1,5,1],[4,2,1]]→7
Constraints#
1 <= m, n <= 200.
Approach#
dp[c] = min sum to reach row’s column c. Each new row: dp[c] = grid[r][c] + min(dp[c], dp[c-1]) (top vs left).
Solution#
class Solution {public: int minPathSum(vector<vector<int>>& g) { int m = g.size(), n = g[0].size(); vector<int> dp(n, INT_MAX); dp[0] = 0; for (int r = 0; r < m; ++r) { dp[0] += g[r][0]; for (int c = 1; c < n; ++c) { dp[c] = g[r][c] + min(dp[c], dp[c - 1]); } } return dp[n - 1]; }};func minPathSum(g [][]int) int { m, n := len(g), len(g[0]) dp := make([]int, n) for i := range dp { dp[i] = math.MaxInt32 } dp[0] = 0 for r := 0; r < m; r++ { dp[0] += g[r][0] for c := 1; c < n; c++ { best := dp[c] if dp[c-1] < best { best = dp[c-1] } dp[c] = g[r][c] + best } } return dp[n-1]}from typing import List
class Solution: def minPathSum(self, g: List[List[int]]) -> int: m, n = len(g), len(g[0]) dp = [float('inf')] * n dp[0] = 0 for r in range(m): dp[0] += g[r][0] for c in range(1, n): dp[c] = g[r][c] + min(dp[c], dp[c - 1]) return dp[n - 1]function minPathSum(g) { const m = g.length, n = g[0].length; const dp = new Array(n).fill(Infinity); dp[0] = 0; for (let r = 0; r < m; r++) { dp[0] += g[r][0]; for (let c = 1; c < n; c++) { dp[c] = g[r][c] + Math.min(dp[c], dp[c - 1]); } } return dp[n - 1];}class Solution { public int minPathSum(int[][] g) { int m = g.length, n = g[0].length; int[] dp = new int[n]; Arrays.fill(dp, Integer.MAX_VALUE); dp[0] = 0; for (int r = 0; r < m; r++) { dp[0] += g[r][0]; for (int c = 1; c < n; c++) { dp[c] = g[r][c] + Math.min(dp[c], dp[c - 1]); } } return dp[n - 1]; }}function minPathSum(g: number[][]): number { const m = g.length, n = g[0].length; const dp: number[] = new Array(n).fill(Infinity); dp[0] = 0; for (let r = 0; r < m; r++) { dp[0] += g[r][0]; for (let c = 1; c < n; c++) { dp[c] = g[r][c] + Math.min(dp[c], dp[c - 1]); } } return dp[n - 1];}Editorial#
Rolling 1D: dp[c] from the previous row holds “top”, dp[c-1] from the current row holds “left”. The first column is updated explicitly (no left predecessor).
Complexity#
- Time: O(m * n).
- Space: O(n).
Concept revision#
Related#