/** * File: min_path_sum.kt * Created Time: 2024-01-25 * Author: curtishd (1023632660@qq.com) */ package chapter_dynamic_programming import kotlin.math.min /* Minimum path sum: Brute force search */ fun minPathSumDFS(grid: Array, i: Int, j: Int): Int { // If it's the top-left cell, terminate the search if (i == 0 && j == 0) { return grid[0][0] } // If the row or column index is out of bounds, return a +∞ cost if (i < 0 || j < 0) { return Int.MAX_VALUE } // Calculate the minimum path cost from the top-left to (i-1, j) and (i, j-1) val up = minPathSumDFS(grid, i - 1, j) val left = minPathSumDFS(grid, i, j - 1) // Return the minimum path cost from the top-left to (i, j) return min(left, up) + grid[i][j] } /* Minimum path sum: Memoized search */ fun minPathSumDFSMem( grid: Array, mem: Array, i: Int, j: Int ): Int { // If it's the top-left cell, terminate the search if (i == 0 && j == 0) { return grid[0][0] } // If the row or column index is out of bounds, return a +∞ cost if (i < 0 || j < 0) { return Int.MAX_VALUE } // If there is a record, return it if (mem[i][j] != -1) { return mem[i][j] } // The minimum path cost from the left and top cells val up = minPathSumDFSMem(grid, mem, i - 1, j) val left = minPathSumDFSMem(grid, mem, i, j - 1) // Record and return the minimum path cost from the top-left to (i, j) mem[i][j] = min(left, up) + grid[i][j] return mem[i][j] } /* Minimum path sum: Dynamic programming */ fun minPathSumDP(grid: Array): Int { val n = grid.size val m = grid[0].size // Initialize dp table val dp = Array(n) { IntArray(m) } dp[0][0] = grid[0][0] // State transition: first row for (j in 1..): Int { val n = grid.size val m = grid[0].size // Initialize dp table val dp = IntArray(m) // State transition: first row dp[0] = grid[0][0] for (j in 1..