【LeetCode】931. Minimum Falling Path Sum 动态规划

 一到简单的DP,一遍AC

当前行状态受上一行的状态约束,很容易写出状态转移方程

dp[i][j]=min(min(dp[i-1][j-1], dp[i-1][j+1]), dp[i-1][j])+A[i][j];

需要处理的是首尾两列,完整代码如下:

class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& A) {
        int dp[101][101];
        for(int j=0; j<A.size(); ++j) dp[0][j] = A[0][j];
        for(int i=1; i<A.size(); ++i)
        {
            for(int j=0; j<A.size(); ++j)
            {
                if(j == 0)
                {
                    dp[i][j] = min(dp[i-1][j+1], dp[i-1][j])+A[i][j];
                }
                else if(j == A.size()-1)
                {
                    dp[i][j] = min(dp[i-1][j-1], dp[i-1][j])+A[i][j];
                }
                else
                    dp[i][j]=min(min(dp[i-1][j-1], dp[i-1][j+1]), dp[i-1][j])+A[i][j];
            }
        }
        int Min = 1000;
        for(int j=0; j<A.size(); ++j)
        {
            if(dp[A.size()-1][j] < Min)
                Min = dp[A.size()-1][j];
        }
        return Min;
    }
};

下面是讨论区的四行AC代码:

int minFallingPathSum(vector<vector<int>>& A) {
  for (auto i = 1; i < A.size(); ++i)
    for (auto j = 0; j < A.size(); ++j)
      A[i][j] += min({ A[i-1][j], A[i-1][max(0,j-1)], A[i-1][min((int)A.size()-1,j+1)] });
  return *min_element(begin(A[A.size() - 1]), end(A[A.size() - 1]));
}

min_element STL 取容器中最小值

min_element(first,end,cmp);

 详见:点击打开链接

相关文章: