65 lines
1.3 KiB
Go
65 lines
1.3 KiB
Go
package q3651
|
|
|
|
import (
|
|
"math"
|
|
"slices"
|
|
)
|
|
|
|
func minCost(grid [][]int, k int) int {
|
|
w, h := len(grid[0]), len(grid)
|
|
gridVal := func(coord int) int { return grid[coord/w][coord%w] }
|
|
|
|
sortedCoords := make([]int, w*h)
|
|
for i := range sortedCoords {
|
|
sortedCoords[i] = (i)
|
|
}
|
|
slices.SortFunc(sortedCoords, func(a, b int) int { return gridVal(a) - gridVal(b) })
|
|
|
|
cache := make([]int32, w*h)
|
|
prevMinCosts := make([]int32, len(sortedCoords))
|
|
|
|
for tele := range k + 1 {
|
|
// Precompute min costs
|
|
if tele > 0 {
|
|
var curMin int32 = math.MaxInt32
|
|
i, j := 0, 0
|
|
for i < len(sortedCoords) {
|
|
curMin = min(curMin, cache[sortedCoords[i]])
|
|
|
|
i++
|
|
for j < i && (i == len(sortedCoords) || gridVal(sortedCoords[i]) > gridVal(sortedCoords[j])) {
|
|
prevMinCosts[sortedCoords[j]] = curMin
|
|
j++
|
|
}
|
|
}
|
|
}
|
|
|
|
for r := h - 1; r >= 0; r-- {
|
|
for c := w - 1; c >= 0; c-- {
|
|
if r == h-1 && c == w-1 {
|
|
continue
|
|
}
|
|
|
|
var val int32 = math.MaxInt32
|
|
if r+1 < h {
|
|
val = min(val, cache[(r+1)*w+c]+int32(grid[r+1][c]))
|
|
}
|
|
if c+1 < w {
|
|
val = min(val, cache[r*w+c+1]+int32(grid[r][c+1]))
|
|
}
|
|
|
|
if tele == 0 {
|
|
cache[r*w+c] = val
|
|
continue
|
|
}
|
|
|
|
// Find min cost with teleports
|
|
cache[r*w+c] = min(val, prevMinCosts[r*w+c])
|
|
}
|
|
}
|
|
}
|
|
|
|
return int(cache[0])
|
|
}
|
|
|
|
var _ = minCost
|