zoukankan      html  css  js  c++  java
  • lintcode 826电脑维修

    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
  • 相关阅读:
    PHP -----上传文件
    PHP----预定义数组
    PHP-------- 会话控制
    PHP------XML
    PHP----练习-----三级联动
    PHP-------ajax返回值 返回JSON 数据
    PHP----练习----光标离开文本框时变色
    使用ansible安装配置zabbix客户端
    svn+apache安装配置
    rsync+lsyncd实现实时同步
  • 原文地址:https://www.cnblogs.com/thinheader/p/12245886.html
Copyright © 2011-2022 走看看