The Dynamic Programming Algorithm to Compute the Minimum Falling

  • 时间:2020-09-24 11:54:15
  • 分类:网络文摘
  • 阅读:163 次

Given a square array of integers A, we want the minimum sum of a falling path through A. A falling path starts at any element in the first row, and chooses one element from each row. The next row’s choice must be in a column that is different from the previous row’s column by at most one.

Example 1:
Input: [[1,2,3],[4,5,6],[7,8,9]]
Output: 12

Explanation:
The possible falling paths are:

[1,4,7], [1,4,8], [1,5,7], [1,5,8], [1,5,9]
[2,4,7], [2,4,8], [2,5,7], [2,5,8], [2,5,9], [2,6,8], [2,6,9]
[3,5,7], [3,5,8], [3,5,9], [3,6,8], [3,6,9]

The falling path with the smallest sum is [1,4,7], so the answer is 12.

Note:
1 <= A.length == A[0].length <= 100
-100 <= A[i][j] <= 100

Dynamic Programming Algorithm to Compute the Minimal Path Sum

If we are at (row, col), we can fall into three possible locations, (row + 1, col – 1), (row + 1, col) and (row + 1, col + 1). We can update the array elements as to simulate the falling process – the accumulated min sum. Each element will be the minimal of the three (or less) possible locations it could fall from.

The DP process could be from top-down, or in the reverse bottom-up, which doewsn’t matter. The DP formula is as follows.

DP(i, j) = min(DP(i - 1, j - 1), DP(i - 1, j), DP(i - 1, j + 1)) + A[i, j]
DP(i, j) = 0 if i < 0 or j >= C where C is the max column
Answer is Min(DP(row - 1))

You can use this algorithm to find minimal path sum in any shape of matrix, for example, a triangle. The following C++ code implements the Dynamic Programming algorithm to find the minimal path sum of a matrix, which runs at O(N) where N is the number of elements in the matrix. The constant space is used, as we directly modify the array elements for intermdiate (accumulated) minimal path sum along the way.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& A) {
        int row = A.size(), col = A[0].size();
        for (int i = 1; i < row; ++ i) {
            for (int j = 0; j < col; ++ j) {
                int v = A[i - 1][j];
                if (j > 0) {
                    v = min(v, A[i - 1][j - 1]);
                }
                if (j + 1 < col) {
                    v = min(v, A[i - 1][j + 1]);
                }
                A[i][j] += v; // updated the accumulated min path sum
            }
        }
        // find minimal of the last row
        return *min_element(A[row - 1].begin(), A[row - 1].end());
    }
};
class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& A) {
        int row = A.size(), col = A[0].size();
        for (int i = 1; i < row; ++ i) {
            for (int j = 0; j < col; ++ j) {
                int v = A[i - 1][j];
                if (j > 0) {
                    v = min(v, A[i - 1][j - 1]);
                }
                if (j + 1 < col) {
                    v = min(v, A[i - 1][j + 1]);
                }
                A[i][j] += v; // updated the accumulated min path sum
            }
        }
        // find minimal of the last row
        return *min_element(A[row - 1].begin(), A[row - 1].end());
    }
};

We need to find the minimal path sum in the last row, using a for-loop or the *min_element in Modern C++.

–EOF (The Ultimate Computing & Technology Blog) —

推荐阅读:
Why You Need To Update Your Jetpack Plug-In Right Now  7 Online Marketing Tools You Need to Master in 2016  How to Compute the Min Cost of Climbing Stairs via Dynamic Progr  The Algorithm to Make Words Bold in HTML  The O(N) Increasing Triplet Subsequence Algorithm  How to Compute the Greatest Common Divisor of Strings?  How to Design a Tic-Tac-Toe Game?  The Facebook Initial Coding Interview Experience  Facebook Onsite Interview Preparation Part 2: Coding Questions  The Process Killing Algorithms using Depth First Search or Bread 
评论列表
添加评论