// [20],
// [30,40],
// [60,50,70],
// [40,10,80,30]]
//状态:F(i,j)从(0,0)到(i,j)的路径和
//转移方程:
        // if(j==0):F(i,j)=F(i-1,j)+arr[i][j]
        // else if(i==j):F(i,j)=F(i-1,j-1)+arr[i][j]
        // else:F(i,j)=min(F(i-1,j),F(i-1,j-1))+arr[i][j]
//初始值:f(0,0)=arr[0][0]
//返回结果:min(F(row-1),j)
class Solution {
public:
    int minimumTotal(vector<vector<int> >& triangle) {
        if(triangle.empty())
            return 0;
        int row=triangle.size();
        for(int i=1;i<row;i++)
        {
            for(int j=0;j<=i;j++)
            {
                if(j==0)
                {
                    triangle[i][j]=triangle[i-1][j]+triangle[i][j];
                }
                else if(j==i)
                {
                    triangle[i][j]=triangle[i-1][j-1]+triangle[i][j];
                }
                else 
                {
                    triangle[i][j]=
                    min(triangle[i-1][j-1],triangle[i-1][j])+triangle[i][j];
                }
            }
        }
        int _min=triangle[row-1][0];
        for(int j=1;j<triangle[row-1].size();j++)
        {
            _min=min(_min,triangle[row-1][j]);
        }
        return _min;
    }
};