# 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

>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++
```cpp
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());
}
};
```