int minPathSumHelper(int m, int n, const vector<vector<int>>& grid, vector<vector<int>>& rec) { if(m == m_rows - 1 && n == m_cols - 1){ rec[m][n] = grid[m][n]; return grid[m][n]; } if(rec[m][n] == -1) { int cur = grid[m][n]; rec[m][n] = cur + min(m < (m_rows - 1) ? minPathSumHelper(m+1, n, grid, rec) : INT_MAX, n < (m_cols - 1) ? minPathSumHelper(m, n+1, grid, rec) : INT_MAX); } return rec[m][n]; }
void minPathSumHelper(int row, int col, vector<vector<int>> &grid, int &sum, int &res) { if (sum > res) return; if (row == 0 && col == 0) { res = min(res, sum + grid[row][col]); } sum += grid[row][col]; if (row) { minPathSumHelper(row - 1, col, grid, sum, res); } if (col) { minPathSumHelper(row, col - 1, grid, sum, res); } sum -= grid[row][col]; }
int minPathSum(vector<vector<int>>& grid) { m_rows = (int)grid.size(); m_cols = (int)grid[0].size(); if(m_rows == 0 || m_cols == 0) return 0; if(m_rows == 1 && m_cols == 1) return grid[0][0]; int s = max(m_rows, m_cols); vector<vector<int>> rec; for(int i = 0; i < s; i++){ rec.push_back(vector<int>(s, -1)); } return minPathSumHelper(0, 0, grid, rec); }
int minPathSum(vector<vector<int>>& grid) { int res = INT_MAX; int sum = 0; minPathSumHelper(grid.size() - 1, grid[0].size() - 1, grid, sum, res); return res; }