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).
 
 # 一个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). class Solution:
"""
@param n: 行
@param m: 列
@param badcomputers: 坏电脑
@return: 答案
""" def maintenance(self, n, m, badcomputers):
dp = [[0, 0] for i in range(n)] # 每一行作为一个子问题,用该数组存储该行的左边解和右边解的步数
matrix = [[0 for i in range(m)] for j in range(n)] # 初始化一个n*m的元素为0的矩阵
# 坏电脑矩阵元素设为1
for node in badcomputers:
matrix[node[0]][node[1]] = 1
for i in range(n):
right = -1 # 右边距
left = -1 # 左边距
for j in range(m):
if matrix[i][j] != 0:
right = j # max(most_right, j)
left = max(left, m - 1 - j)
if i == 0:
if right == -1:
dp[0][0] = 0
dp[0][1] = m - 1
else:
dp[0][0] = 2 * right
dp[0][1] = m - 1
continue
if right == -1: # 如果该行没有坏电脑,直接进入下一行
dp[i][0] = dp[i - 1][0] + 1
dp[i][1] = dp[i - 1][1] + 1
else: # 取当前行相对上一行的最优解
dp[i][0] = min(dp[i - 1][0] + 2 * right,
dp[i - 1][1] + m - 1) + 1
dp[i][1] = min(dp[i - 1][1] + 2 * left,
dp[i - 1][0] + m - 1) + 1
return min(dp[n - 1][0], dp[n - 1][1]) if __name__ == '__main__':
# n = 3
# m = 10
# list = [[0, 0], [0, 9], [1, 7]]
n = 3
m = 10
list = [[0, 3], [1, 7], [1, 2]]
solution = Solution()
res = solution.maintenance(n, m, list)
print(res)

826.py

lintcode 826电脑维修的更多相关文章

  1. iOS----------Mac维修预约-如何找到电脑维修单

    先打开苹果官网,找到技术支持 2.选择维修选项 3.查看维修状态 4.显示维修时间订单

  2. 上海苹果维修点分享苹果电脑MACBOOK故障维修常见案例

    苹果的电子设备无论是外观和性能都是无与伦比的美丽,很多开发者都开始选用苹果电脑macbook.近年来苹果售后维修点来维修苹果电脑的用户也越来越多,我们上海苹果维修点就整理分享了一些苹果电脑MACBOO ...

  3. 原装win8系统电脑崩溃问题解决

    原装win8系统电脑崩溃问题解决 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:之所以撰写本篇关于win8原装系统电脑崩溃的博文,一是要吐槽一下原装w ...

  4. 我的MacbookPro进水了!维修过程记录

    电脑进水与解决方案 如果事情有变坏的可能,不管这种可能性有多小,它总会发生.---墨菲定律 进水过程 2020年03月21日日下午3点左右,不小心把水杯碰倒了,水通过电脑右侧的键盘处进入了大概有10毫 ...

  5. 【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】

    OA项目中有极大可能性使用到JBPM框架解决流程控制问题,比如请假流程.报销流程等等. JBPM:JBoss Business Process Management,翻译过来就是业务流程管理.实际上就 ...

  6. 并查集 poj2236

    网址:http://poj.org/problem?id=2236 题意:有n台坏的电脑,如果每两台电脑的距离不能超过d,那么这两台电脑有联系,用字符串O 表示标记第x台电脑维修了,用S判断从X到y是 ...

  7. SQL Server 2008 R2——PIVOT 行转列 以及聚合函数的选择

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  8. SQL Server 2008 R2——ROW_NUMBER() 去掉不同行中相同列的重复内容

    ==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...

  9. 较全的IT方面帮助文档

    http://www.shouce.ren/post/d/id/108632 XSLT参考手册-新.CHMhttp://www.shouce.ren/post/d/id/108633 XSL-FO参考 ...

随机推荐

  1. Node教程——API接口开发(MangoDB+Express)

    一.大纲 大纲: 关于架构, 首先我们的有一个app.js这个就是根路由起点,用来最初的打入口 它的功能有: 1.1 引入模块创建基础的网站服务器, 1.2 导入bodyPasser,过滤还有处理我们 ...

  2. 36 Thread 多线程

    /* * 多线程的实现方式: * 方式1:一种方法是将类声明为 Thread 的子类.该子类应重写 Thread 类的 run 方法.接下来可以分配并启动该子类的实例 * * Thread * Str ...

  3. Array(数组)对象-->shift() 方法

    1.定义和用法 shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值. 语法: array.shift() 注意: 此方法改变数组的长度! 举例: var arr = [1,2, ...

  4. C++语言实现双向链表

    这篇文章是关于利用C++模板的方式实现的双向链表以及双向链表的基本操作,在之前的博文C语言实现双向链表中,已经给大家分析了双向链表的结构,并以图示的方式给大家解释了双向链表的基本操作.本篇文章利用C+ ...

  5. go中的线程的实现模型-P G M的调度

    线程实现模型 go中线程的实现是依靠 P G M M machine的缩写.一个M代表一个内核线程,或称“工作线程” P processor的缩写.一个P代表执行一个Go代码片段所需要的资源(或称“上 ...

  6. Spring 中 用 ${xxx} 读取properties文件的说明

    properties 如果在 spring 中通过 PropertyPlaceholderConfigurer 加载,当spring 中需要 用到 properties 中的一些 key 和value ...

  7. Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统

    Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统 作者: 深蓝色右手  来源: 博客园  发布时间: 2011-04-19 11:18  阅读: 1282 次  推荐: 0 ...

  8. Python 获取任意周期开盘日

    import json import requests import datetime import tushare as ts cal_dates = ts.trade_cal() today=da ...

  9. Gallery实现图片拖动切换

    Gallery中文意思为画廊,通过Gallery能够实现用手指在屏幕上滑动实现图片的拖动.效果如下: 上面,为了学习了解,只用了android默认的Icon图片. 主程序中创建了一个继承自BaseAd ...

  10. 【Canvas】(2)---绘制折线图

    绘制折线图 之前在工作的时候,用过百度的ECharts绘制折线图,上手很简单,这里通过canvas绘制一个简单的折线图.这里将一整个绘制过程分为几个步骤: 1.绘制网格 2.绘制坐标系 3.绘制点 4 ...