- `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;
}
};
```