#include <iostream>
#include <vector>
using namespace std;
/***
* 问题:求一个矩形数组的从最左上到最右下的距离总和
* 特点:每个格子元素代表的距离要使它们相加的和最小
* 地图:
* [1,3,1],
* [1,5,1],
* [4,2,1]
*难点:如果按题目要求从最右开始会发现一开始选择最短的路径到最后可能就不是了
* 相当于贪心算法了------>而与贪心对应的则是动态规划
* 动态规划的穷举加记忆化---->因此我们改变数组的元素的含义让他们表示到达终点的最短距离
* 因此从离终点最近的点开始,以后的每个点的决策都1取决于上一个点的结果
* [7,6,3],
* [8,7,2],
* [7,3,1]
* 从而退出了从最左上到最右下的最短距离
*/
class Solution
{
private:
public:
int minPathSum(vector<vector<int>>& grid) {
int n = grid.size();
int m = grid[0].size();
for(int i=1;i<m;i++)
{
grid[0][i] += grid[0][i-1]; //是什么就定义什么,要求什么就表示什么
}
for(int i=1;i<n;i++)
{
grid[i][0] += grid[i-1][0]; //将边的路径求出来
}
for(int i=1;i<n;i++) //第一个点作为起点不好求就换成第二个
{
for(int j=1;j<m;j++)
{
grid[i][j]+=min(grid[i-1][j],grid[i][j-1]);
}
}
return grid[n-1][m-1];
}
};