/** * File: min_path_sum.kt * Created Time: 2024-01-25 * Author: curtishd (1023632660@qq.com) */ package chapter_dynamic_programming import kotlin.math.min /* Минимальная сумма пути: полный перебор */ fun minPathSumDFS(grid: Array, i: Int, j: Int): Int { // Если это верхняя левая ячейка, завершить поиск if (i == 0 && j == 0) { return grid[0][0] } // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ if (i < 0 || j < 0) { return Int.MAX_VALUE } // Вычислить минимальную стоимость пути из левого верхнего угла до (i-1, j) и (i, j-1) val up = minPathSumDFS(grid, i - 1, j) val left = minPathSumDFS(grid, i, j - 1) // Вернуть минимальную стоимость пути из левого верхнего угла до (i, j) return min(left, up) + grid[i][j] } /* Минимальная сумма пути: поиск с мемоизацией */ fun minPathSumDFSMem( grid: Array, mem: Array, i: Int, j: Int ): Int { // Если это верхняя левая ячейка, завершить поиск if (i == 0 && j == 0) { return grid[0][0] } // Если индексы строки или столбца выходят за границы, вернуть стоимость +∞ if (i < 0 || j < 0) { return Int.MAX_VALUE } // Если запись уже есть, вернуть сразу if (mem[i][j] != -1) { return mem[i][j] } // Минимальная стоимость пути для левой и верхней ячеек val up = minPathSumDFSMem(grid, mem, i - 1, j) val left = minPathSumDFSMem(grid, mem, i, j - 1) // Сохранить и вернуть минимальную стоимость пути из левого верхнего угла до (i, j) mem[i][j] = min(left, up) + grid[i][j] return mem[i][j] } /* Минимальная сумма пути: динамическое программирование */ fun minPathSumDP(grid: Array): Int { val n = grid.size val m = grid[0].size // Инициализация таблицы dp val dp = Array(n) { IntArray(m) } dp[0][0] = grid[0][0] // Переход состояний: первая строка for (j in 1..): Int { val n = grid.size val m = grid[0].size // Инициализация таблицы dp val dp = IntArray(m) // Переход состояний: первая строка dp[0] = grid[0][0] for (j in 1..