lintcode 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). 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电脑维修的更多相关文章
- iOS----------Mac维修预约-如何找到电脑维修单
先打开苹果官网,找到技术支持 2.选择维修选项 3.查看维修状态 4.显示维修时间订单
- 上海苹果维修点分享苹果电脑MACBOOK故障维修常见案例
苹果的电子设备无论是外观和性能都是无与伦比的美丽,很多开发者都开始选用苹果电脑macbook.近年来苹果售后维修点来维修苹果电脑的用户也越来越多,我们上海苹果维修点就整理分享了一些苹果电脑MACBOO ...
- 原装win8系统电脑崩溃问题解决
原装win8系统电脑崩溃问题解决 声明:引用请注明出处http://blog.csdn.net/lg1259156776/ 说明:之所以撰写本篇关于win8原装系统电脑崩溃的博文,一是要吐槽一下原装w ...
- 我的MacbookPro进水了!维修过程记录
电脑进水与解决方案 如果事情有变坏的可能,不管这种可能性有多小,它总会发生.---墨菲定律 进水过程 2020年03月21日日下午3点左右,不小心把水杯碰倒了,水通过电脑右侧的键盘处进入了大概有10毫 ...
- 【Java EE 学习 67 上】【OA项目练习】【JBPM工作流的使用】
OA项目中有极大可能性使用到JBPM框架解决流程控制问题,比如请假流程.报销流程等等. JBPM:JBoss Business Process Management,翻译过来就是业务流程管理.实际上就 ...
- 并查集 poj2236
网址:http://poj.org/problem?id=2236 题意:有n台坏的电脑,如果每两台电脑的距离不能超过d,那么这两台电脑有联系,用字符串O 表示标记第x台电脑维修了,用S判断从X到y是 ...
- SQL Server 2008 R2——PIVOT 行转列 以及聚合函数的选择
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- SQL Server 2008 R2——ROW_NUMBER() 去掉不同行中相同列的重复内容
==================================声明================================== 本文原创,转载在正文中显要的注明作者和出处,并保证文章的完 ...
- 较全的IT方面帮助文档
http://www.shouce.ren/post/d/id/108632 XSLT参考手册-新.CHMhttp://www.shouce.ren/post/d/id/108633 XSL-FO参考 ...
随机推荐
- Node教程——API接口开发(MangoDB+Express)
一.大纲 大纲: 关于架构, 首先我们的有一个app.js这个就是根路由起点,用来最初的打入口 它的功能有: 1.1 引入模块创建基础的网站服务器, 1.2 导入bodyPasser,过滤还有处理我们 ...
- 36 Thread 多线程
/* * 多线程的实现方式: * 方式1:一种方法是将类声明为 Thread 的子类.该子类应重写 Thread 类的 run 方法.接下来可以分配并启动该子类的实例 * * Thread * Str ...
- Array(数组)对象-->shift() 方法
1.定义和用法 shift() 方法用于把数组的第一个元素从其中删除,并返回第一个元素的值. 语法: array.shift() 注意: 此方法改变数组的长度! 举例: var arr = [1,2, ...
- C++语言实现双向链表
这篇文章是关于利用C++模板的方式实现的双向链表以及双向链表的基本操作,在之前的博文C语言实现双向链表中,已经给大家分析了双向链表的结构,并以图示的方式给大家解释了双向链表的基本操作.本篇文章利用C+ ...
- go中的线程的实现模型-P G M的调度
线程实现模型 go中线程的实现是依靠 P G M M machine的缩写.一个M代表一个内核线程,或称“工作线程” P processor的缩写.一个P代表执行一个Go代码片段所需要的资源(或称“上 ...
- Spring 中 用 ${xxx} 读取properties文件的说明
properties 如果在 spring 中通过 PropertyPlaceholderConfigurer 加载,当spring 中需要 用到 properties 中的一些 key 和value ...
- Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统
Silverlight 2.5D RPG游戏技巧与特效处理:(十一)AI系统 作者: 深蓝色右手 来源: 博客园 发布时间: 2011-04-19 11:18 阅读: 1282 次 推荐: 0 ...
- Python 获取任意周期开盘日
import json import requests import datetime import tushare as ts cal_dates = ts.trade_cal() today=da ...
- Gallery实现图片拖动切换
Gallery中文意思为画廊,通过Gallery能够实现用手指在屏幕上滑动实现图片的拖动.效果如下: 上面,为了学习了解,只用了android默认的Icon图片. 主程序中创建了一个继承自BaseAd ...
- 【Canvas】(2)---绘制折线图
绘制折线图 之前在工作的时候,用过百度的ECharts绘制折线图,上手很简单,这里通过canvas绘制一个简单的折线图.这里将一整个绘制过程分为几个步骤: 1.绘制网格 2.绘制坐标系 3.绘制点 4 ...