- `grid` 一个矩阵,每个元素不重复,也就是说任意一个`i`和`j`,`grid[i][j]`的值不重复 - `moveCost` 表示移动消耗,`moveCost[i][j]` 是从值为 `i` 的单元格移动到下一行第 `j` 列单元格的代价 - 到一个点的代价等于点本身的值**加上**移动消耗 因此,我们从倒数第二层从下往上遍历,计算到达第`i`层`j`位置的最小代价,最后遍历顶层所有点,最小值即为最小路径代价 ```cpp class Solution { public: int minPathCost(vector<vector<int>> &grid, vector<vector<int>> &moveCost) { int m = grid.size(), n = grid[0].size(); //从倒数第二层开始遍历每一层 for (auto i{m - 2}; i >= 0; i--) { //遍历每一层的每一个位置 for (auto j{0}; j < n; j++) { auto minCost{INT_MAX}; //遍历下一层的每一个位置 for (auto k{0}; k < n; k++) { //计算到下一层第k个位置的最小代价 minCost = min(minCost, grid[i + 1][k] + moveCost[grid[i][j]][k]);//更新最小代价 } //设置当前位置的最小代价 grid[i][j] += minCost; } } auto minCost{INT_MAX}; for (auto i{0}; i < n; i++) {//遍历第一层的每一个位置 minCost = min(minCost, grid[0][i]);//更新最小代价 } return minCost; } }; ```