#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; } };
原文地址:https://www.cnblogs.com/z2529827226/p/11749850.html
时间: 2024-10-09 12:53:17