酷代码 AI
菜单
服务商

题目描述 你准备参加一场野外登山活动。给你一个n x n(3 ≤ n ≤ 10)的平面地图maps,地图中每个格子里的数值表示高度(高度均为非负数)。 你的起始点是maps最左上角的小格子,终点是maps最右下角的小格子。 在不超出地图maps范围的情况下,每次你可以选择往右或往下移动,并且只能移动一个小格。 请你找到耗费体力最小的一条路径,计算出从左上角走到右下角的最小体力消耗值。 (体力消耗值是指走完一条路径上所有相邻格子间的高度差之和。) 输入描述 第一行,一个整数n 接下来n行,每行n个整数,整数之间用空格隔开,表示地图maps中每个格子对应的高度 输出描述 共一行,一个整数,表示最小体力消耗值

以下是使用 Python 实现的解决方案: ```python # 读取输入 n = int(input()) maps = [] for _ in range(n): # 将每行输入按空格分割并转换为整数列表 row = list(map(int, input().split())) maps.append(row) # 创建一个二维数组 dp 来存储到达每个格子的最小体力消耗值 dp = [[0] * n for _ in range(n)] # 初始化第一行和第一列 for i in range(1, n): # 第一行的格子只能从左边的格子过来 dp[0][i] = dp[0][i - 1] + abs(maps[0][i] - maps[0][i - 1]) for i in range(1, n): # 第一列的格子只能从上边的格子过来 dp[i][0] = dp[i - 1][0] + abs(maps[i][0] - maps[i - 1][0]) # 填充 dp 数组 for i in range(1, n): for j in range(1, n): # 计算从上方过来的体力消耗 from_up = dp[i - 1][j] + abs(maps[i][j] - maps[i - 1][j]) # 计算从左方过来的体力消耗 from_left = dp[i][j - 1] + abs(maps[i][j] - maps[i][j - 1]) # 取较小的体力消耗值 dp[i][j] = min(from_up, from_left) # 输出右下角格子的最小体力消耗值 print(dp[n - 1][n - 1]) ``` 代码解释 1. 输入读取:首先读取地图的大小 `n`,然后逐行读取地图中每个格子的高度,并将其存储在二维列表 `maps` 中。 2. 初始化 `dp` 数组:创建一个 `n x n` 的二维数组 `dp`,用于存储到达每个格子的最小体力消耗值。初始化第一行和第一列的 `dp` 值,因为它们只能从左边或上边的格子过来。 3. 填充 `dp` 数组:对于其他格子,计算从上方和左方过来的体力消耗,并取较小值作为到达该格子的最小体力消耗值。 4. 输出结果:最后输出右下角格子的最小体力消耗值。 复杂度分析 - 时间复杂度:$O(n^2)$,因为需要遍历地图中的每个格子。 - 空间复杂度:$O(n^2)$,主要用于存储 `dp` 数组。 [2026-02-07 20:35:50 | AI问答 | 601点数解答]

相关提问
发财导航,免费问AI
实用工具查看更多