/** * 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..