Minimum Falling Path Sum
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
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.
Solution
const maxNum = 10000
func minFallingPathSum(A [][]int) int {
size := len(A)
dp := make([]int, size)
ret := maxNum
copy(dp, A[0])
for _, row := range A[1:]{
tmps := [100]int{}
for c, v := range row{
l, r := max(c-1, 0), min(size-1, c+1)
tmp := maxNum
for k:=l;k<=r;k++ {
tmp= min(tmp, dp[k]+v)
}
tmps[c] = tmp
}
dp = tmps[:size]
}
for _, r := range dp {
ret = min(ret, r)
}
return ret
}
func max(a, b int) int {
if a>b{
return a
}
return b
}
func min(a, b int) int{
if a<b{
return a
}
return b
}