lc-go/solutions/36/q3651/solution.go
2026-02-01 14:48:00 +09:00

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