c++的下降路径最短和---->动态规划详解

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

猜你喜欢

转载自www.cnblogs.com/z2529827226/p/11749850.html