#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
/***
* 分析:<----最优化问题----->此题用动态规划去写
* 1、第一步确定状态---->直接用它自己本身去写A[n][c]
* 表示从第n层的第c个元素往下的最下的距离
* 2、第二步确定状态转移方程
* 状态转移方程可以分为三个部分
* 1、当c==0的时候
* A[n][c]+=min(A[n+1][c],A[n+1][c+1]);
* 2、当c<列宽时
* A[n][c]+=min3(A[n+1][c-1],A[n+1][c],A[n+1][c+1]);
* 3、当c==列宽时
* A[][]+=min(A[n+1][c-1],A[n+1][c]);
* 三种情况都写出来后就可以找出第一排中的最小的元素并返回即可
* res=min(res,A[0][i]);------>来个for循环
* return res;
*/
class Solution {
public:
int min3(int x,int y,int z)
{
return min(min(x,y),z);
}
public:
int minFallingPathSum(vector<vector<int>>& A) {
int m=A.size();
for(int i=m-2;i>=0;--i) //从倒数第二排开始
{
for(int j=0;j<A[i].size();++j)
{
if(j==0)
A[i][j]+=min(A[i+1][j],A[i+1][j+1]);
else if(j==A[i].size()-1)
A[i][j]+=min(A[i+1][j-1],A[i+1][j]);
else if(j<A[i].size()-1)
A[i][j]+=min3(A[i+1][j-1],A[i+1][j],A[i+1][j+1]);
}
}
int res=INT_MAX;
for(int i=0;i<A[0].size();++i)
res=min(res,A[0][i]);
return res;
}
};