
class Solution {
public:
// vector<int> allAns;
// int minPathSum(vector<vector<int>>& grid) {
// int ans = 0;
// int m = grid.size();
// int n = grid[0].size();
// goWay(ans, grid, 0 , 0);
// return *std::min_element(allAns.begin(), allAns.end());
// }
// void goWay(int tempans, vector<vector<int>> grid, int x, int y){
// if(x == grid.size()-1 && y == grid[0].size()-1){
// tempans+=grid[x][y];
// allAns.push_back(tempans);
// }
// if(x >= grid.size() || y >= grid[0].size())
// return;
// tempans += grid[x][y];
// goWay(tempans, grid, x+1, y);
// goWay(tempans, grid, x, y+1);
// }
int minPathSum(vector<vector<int>>& grid) {
if (grid.size() == 0 || grid[0].size() == 0) {
return 0;
}
int rows = grid.size(), columns = grid[0].size();
auto dp = vector < vector <int> > (rows, vector <int> (columns));
dp[0][0] = grid[0][0];
for (int i = 1; i < rows; i++) {
dp[i][0] = dp[i - 1][0] + grid[i][0];
}
for (int j = 1; j < columns; j++) {
dp[0][j] = dp[0][j - 1] + grid[0][j];
}
for (int i = 1; i < rows; i++) {
for (int j = 1; j < columns; j++) {
dp[i][j] = min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
}
}
return dp[rows - 1][columns - 1];
}
};