首页 > 技术文章 > lintcode 826电脑维修

thinheader 原文

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)
826.py

推荐阅读