1289. Minimum Falling Path Sum II
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 1:

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 == gridi.length
- 1 <= n <= 200
- -99 <= gridij <= 99
From: LeetCode
Link: 1289. Minimum Falling Path Sum II
Solution:
Ideas:
For each row, find the smallest and second-smallest sums from the previous row, then avoid using the smallest when it is in the same column.
Code:
c
int minFallingPathSum(int** grid, int gridSize, int* gridColSize) {
int n = gridSize;
for (int row = 1; row < n; row++) {
int min1 = 1000000000;
int min2 = 1000000000;
int minCol = -1;
// Find the smallest and second smallest values in the previous row.
for (int col = 0; col < n; col++) {
int value = grid[row - 1][col];
if (value < min1) {
min2 = min1;
min1 = value;
minCol = col;
} else if (value < min2) {
min2 = value;
}
}
// Use min2 when the smallest value is in the same column.
for (int col = 0; col < n; col++) {
if (col == minCol) {
grid[row][col] += min2;
} else {
grid[row][col] += min1;
}
}
}
int answer = grid[n - 1][0];
for (int col = 1; col < n; col++) {
if (grid[n - 1][col] < answer) {
answer = grid[n - 1][col];
}
}
return answer;
}