object MinimumPathSum {
def minPathSum(grid: Array[Array[Int]]): Int = {
if (grid.isEmpty || grid(0).isEmpty) return 0
val rows = grid.length
val cols = grid(0).length
val dp = Array.ofDim[Int](rows, cols)
dp(0)(0) = grid(0)(0)
for (i <- 1 until rows) {
dp(i)(0) = dp(i - 1)(0) + grid(i)(0)
}
for (j <- 1 until cols) {
dp(0)(j) = dp(0)(j - 1) + grid(0)(j)
}
for (i <- 1 until rows) {
for (j <- 1 until cols) {
dp(i)(j) = grid(i)(j) + Math.min(dp(i - 1)(j), dp(i)(j - 1))
}
}
dp(rows - 1)(cols - 1)
}
def main(args: Array[String]): Unit = {
val grid = Array(
Array(1, 3, 1),
Array(1, 5, 1),
Array(4, 2, 1)
)
val minSum = minPathSum(grid)
println(s"Minimum path sum: $minSum")
}
}