# 64. Minimum Path Sum ###### tags: `C++` `LeetCode` `Medium` `Dynamic Programming` ## Notes ``` 使用 DP + memo 可以避免重複計算 memo[x][y] 指的是從位置 (0, 0) 到位置 (x, y) 所需要花費的最少的錢 ``` ## Code ```c++ #include <vector> #include <algorithm> #include <climits> #include "cout.h" int minPathSum(vector<vector<int>>& grid); int minPathSumDP(vector<vector<int>>& grid, vector<vector<int>>& memo, int m, int n, int x, int y); int main() { vector<vector<int>> grid = {{1, 3, 1}, {1, 5, 1}, {4, 2, 1}}; cout << minPathSum(grid) << endl; return 0; } int minPathSum(vector<vector<int>>& grid) { int m = grid.size(); int n = grid[0].size(); vector<vector<int>> memo(m, vector<int> (n, -1)); return minPathSumDP(grid, memo, m, n, m - 1, n - 1); } int minPathSumDP(vector<vector<int>>& grid, vector<vector<int>>& memo, int m, int n, int x, int y) { if(x == 0 && y == 0) return grid[0][0]; if(x == 0) return minPathSumDP(grid, memo, m, n, x, y - 1) + grid[x][y]; if(y == 0) return minPathSumDP(grid, memo, m, n, x - 1, y) + grid[x][y]; if(memo[x][y] == -1) { memo[x][y] = min(minPathSumDP(grid, memo, m, n, x - 1, y) + grid[x][y], minPathSumDP(grid, memo, m, n, x, y - 1) + grid[x][y]); } return memo[x][y]; } ```