/** * 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 row or column index is out of bounds, return +∞ cost if (i < 0 || j < 0) { return Int.MAX_VALUE } // Calculate the minimum path cost from 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 top-left to (i, j) return min(left, up) + grid[i][j] } /* Minimum path sum: Memoization 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 row or column index is out of bounds, return +∞ cost if (i < 0 || j < 0) { return Int.MAX_VALUE } // If there's a record, return it directly if (mem[i][j] != -1) { return mem[i][j] } // Minimum path cost for left and upper 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 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..