826,一个n * m矩阵代表一个电脑的阵列,给你一个list< Point >代表坏掉的电脑坐标。现在我们从(0,0)出发修电脑,要求:
1.必须修完当前行所有坏掉的电脑才能走向下一行。
2.如果要走向下一行,修理工必须先返回到这一行的最左端或者最右端。
求最短的访问距离。
输入的矩阵大小为 n x m ,n <= 200,m <= 200。
坏掉的机器 num <= 1000。
修完最后一台电脑后,也需要返回最后一行的最左端或最右端。
# example:
# Input:
# n = 3
# m = 10
# list = [[0,0],[0,9],[1,7]]
# Output: 15
# Explanation:
# Starting from (0,0), fix 0, then go to (0,9) to fix 1 and go from (0,9) to next line (1,9), then go to (1,7) to fix 3, then go back to (1,9) and go to (2,9).

1 # 一个n * m矩阵代表一个电脑的阵列,给你一个list< Point >代表坏掉的电脑坐标。现在我们从(0,0)出发修电脑,要求: 2 # 1.必须修完当前行所有坏掉的电脑才能走向下一行。 3 # 2.如果要走向下一行,修理工必须先返回到这一行的最左端或者最右端。 4 # 求最短的访问距离。 5 # 6 # 输入的矩阵大小为 n x m ,n <= 200,m <= 200。 7 # 坏掉的机器 num <= 1000。 8 # 修完最后一台电脑后,也需要返回最后一行的最左端或最右端。 9 10 # example: 11 # Input: 12 # n = 3 13 # m = 10 14 # list = [[0,0],[0,9],[1,7]] 15 # Output: 15 16 # Explanation: 17 # Starting from (0,0), fix 0, then go to (0,9) to fix 1 and go from (0,9) to next line (1,9), then go to (1,7) to fix 3, then go back to (1,9) and go to (2,9). 18 19 20 class Solution: 21 """ 22 @param n: 行 23 @param m: 列 24 @param badcomputers: 坏电脑 25 @return: 答案 26 """ 27 28 def maintenance(self, n, m, badcomputers): 29 dp = [[0, 0] for i in range(n)] # 每一行作为一个子问题,用该数组存储该行的左边解和右边解的步数 30 matrix = [[0 for i in range(m)] for j in range(n)] # 初始化一个n*m的元素为0的矩阵 31 # 坏电脑矩阵元素设为1 32 for node in badcomputers: 33 matrix[node[0]][node[1]] = 1 34 for i in range(n): 35 right = -1 # 右边距 36 left = -1 # 左边距 37 for j in range(m): 38 if matrix[i][j] != 0: 39 right = j # max(most_right, j) 40 left = max(left, m - 1 - j) 41 if i == 0: 42 if right == -1: 43 dp[0][0] = 0 44 dp[0][1] = m - 1 45 else: 46 dp[0][0] = 2 * right 47 dp[0][1] = m - 1 48 continue 49 if right == -1: # 如果该行没有坏电脑,直接进入下一行 50 dp[i][0] = dp[i - 1][0] + 1 51 dp[i][1] = dp[i - 1][1] + 1 52 else: # 取当前行相对上一行的最优解 53 dp[i][0] = min(dp[i - 1][0] + 2 * right, 54 dp[i - 1][1] + m - 1) + 1 55 dp[i][1] = min(dp[i - 1][1] + 2 * left, 56 dp[i - 1][0] + m - 1) + 1 57 return min(dp[n - 1][0], dp[n - 1][1]) 58 59 60 if __name__ == '__main__': 61 # n = 3 62 # m = 10 63 # list = [[0, 0], [0, 9], [1, 7]] 64 n = 3 65 m = 10 66 list = [[0, 3], [1, 7], [1, 2]] 67 solution = Solution() 68 res = solution.maintenance(n, m, list) 69 print(res)