Try   HackMD

1289. Minimum Falling Path Sum II

Description

Given an n x n integer matrix grid, return the minimum sum of a falling path with non-zero shifts.

A falling path with non-zero shifts is a choice of exactly one element from each row of grid such that no two elements chosen in adjacent rows are in the same column.

Example

Example1

Image Not Showing Possible Reasons
  • The image was uploaded to a note which you don't have access to
  • The note which the image was originally uploaded to has been deleted
Learn More →

Input: grid = [[1,2,3],[4,5,6],[7,8,9]]
Output: 13
Explanation:
The possible falling paths are:
[1,5,9], [1,5,7], [1,6,7], [1,6,8],
[2,4,8], [2,4,9], [2,6,7], [2,6,8],
[3,4,8], [3,4,9], [3,5,7], [3,5,9]
The falling path with the smallest sum is [1,5,7], so the answer is 13.

Example 2:

Input: grid = [[7]]
Output: 7

Constraints:

  • n == grid.length == grid[i].length
  • 1 <= n <= 200
  • -99 <= grid[i][j] <= 99

思路

使用 DP 將每一層最小的值加進下一層之中,因為他限制不能使用上下相鄰的用素,所以要多加判斷,不能直接取最小值。
所以如 example:
[[1,2.3],
[4,5,6],
[7,8,9]]
first iteration
[[1,2.3],
[6,6,7],
[7,8,9]]
second iteration
[[1,2.3],
[6,6,7],
[13,14,15]]
我們再取最後一層獲取最小的元素 ans = 13

會使用一個 tmp vector 去暫存前一層數據,將他 sort 之後可以選到最小值或是第二小值。
這邊要筆記的是 c++ vector 的複製是使用 tmp = grid[i - 1],直接對應要複製的值就可以完成複製。

C++

class Solution {
public:
    int minFallingPathSum(vector<vector<int>>& grid) {
        int n = grid.size();
        int i, j;
        vector<int> tmp(n);

        for (i = 1; i < n; i++) {
            tmp = grid[i - 1];
            sort(tmp.begin(), tmp.end());
            for (j = 0; j < n; j++) {
                if (grid[i - 1][j] == tmp[0])
                    grid[i][j] += tmp[1];
                else
                    grid[i][j] += tmp[0];
            }
        }
        return *min_element(grid[n - 1].begin(), grid[n - 1].end());
    }
};