pc28单双永久2017平码固定算法公式2017;有高见吗?

2017阿里内推笔试题--算法工程师(运筹优化)
2017阿里内推笔试题–算法工程师(运筹优化)
沐哲是一个菜鸟仓库的一个拣货员,但他有非常个怪异的习惯。每次拣货的重量都要比之前拣的一个轻,每次拣到货后都可以得到1块钱,沐哲想知道这样最多能赚多少钱
32 34 7 33 21 2
13 12 3 11 26 36
16 30 22 1 24 14
20 23 25 5 19 29
27 15 9 17 31 4
6 18 8 10 35 28
沐哲可以从仓库的某个货架开始拣货,下一步可以往上走,也可以往下走,当然,向左向右也可以,但必须使得下一个货物重量减小,才会去拣。在上面的仓库中,一条可拣货的路径为 25-22-3。当然30-23-20-16-13-12-3可以拣的货更多。这也是赚钱最多的一条路径。
输入行数、列数和数据矩阵,输出所赚的最大钱数。
32 34 7 33 21 2
13 12 3 11 26 36
16 30 22 1 24 14
20 23 25 5 19 29
27 15 9 17 31 4
6 18 8 10 35 28
此题应该属于树搜索的题目,拿到题目后一直在想怎么用动态规划。结果测试时间都过了,还是没做出来,真是搓的一笔。
最暴力的解法就是对每个点遍历,以每个点为起点进行深度优先搜索,找它相邻点的可行路径。搜索后将最大结果保存到当前位置,等遍历完后,找到矩阵元素的最大值,然后输出该值。
def isInside(row,col,i,j):
return (i in range(row)) and (j in range(col))
def currentMaxStep(data,row,col,i,j):
max_step=0
directs = [(-1,0),(1,0),(0,-1),(0,1)]
for (dx,dy) in directs:
x,y = i+dx,j+dy
if(isInside(row,col,x,y) and data[x][y] & data[i][j]):
max_step = max([currentMaxStep(data,row,col,x,y),max_step])
return max_step + 1
def getMaxMap(data,row,col):
Map = [[0 for j in range(col)] for i in range(row)]
for i in range(row):
for j in range(col):
Map[i][j] = currentMaxStep(data,row,col,i,j)
print('the max step map is:')
for i in range(row):
print(Map[i])
return Map
def maxStep(data,row,col):
Map = getMaxMap(data,row,col)
return max([max(i) for i in Map])
if __name__=='__main__':
row,col = 6,6
data = [[32,
print(maxStep(data,row,col))
[4, 5, 2, 3, 2, 1]
[3, 2, 1, 2, 5, 6]
[4, 7, 2, 1, 4, 1]
[5, 6, 7, 2, 3, 4]
[6, 3, 2, 3, 4, 1]
[1, 4, 1, 2, 5, 2]
我们发现,每个点在进行深度优先搜索时,会遇到和其他点相同的路径,所以优化的空间。如果当前节点在之前已经搜索过了,这时候就需要判断需不需要继续搜索。两种情况
1、当前计算最大步数值大于之前遍历到该点的最大步数值,说明当前路径要比之前的路径更优,需要更新。
2、反之,不在搜索当前路径。
举个例子: 如data的第一个元素的最大路径为:32-13-12-3,最大步数为4; 当对第二个元素遍历时,假设按照上下左右的顺序,向下34-12-3为一条路径,此时第二元素的最大步数为3,向左34-32-13-12-3是个可行路径,而32-13-12-3之前已经搜索过,可以利用之前的32的最大步数值,直接比较4+1 和 3,更新第二元素的最大步数为5.
注意: 要实现这一操作,需要在遍历的过程中使用一个map来存储已遍历节点的最大步数值。
def isInside(row,col,i,j):
return (i in range(row)) and (j in range(col))
def updateMap(data,Map,row,col,i,j):
directs = [(-1,0),(1,0),(0,-1),(0,1)]
for (dx,dy) in directs:
x,y = i+dx,j+dy
if(isInside(row,col,x,y) and data[x][y] & data[i][j] and Map[x][y] & Map[i][j]+1):
Map[x][y] = Map[i][j]+1
updateMap(data, Map,row,col,x,y)
def maxStep(data,row,col):
Map = [[1 for j in range(col)] for i in range(row)]
[updateMap(data,Map,row,col,i,j) for i in range(row) for j in range(col)]
print('the max step map is:')
[print(Map[i]) for i in range(row)]
return max([max(i) for i in Map])
if __name__=='__main__':
row,col = 6,6
data = [[32,
print(maxStep(data,row,col))
[4, 5, 2, 3, 2, 1]
[3, 2, 1, 2, 5, 6]
[4, 7, 2, 1, 4, 1]
[5, 6, 7, 2, 3, 4]
[6, 3, 2, 3, 4, 1]
[1, 4, 1, 2, 5, 2]
使用一个map记录已经遍历的元素的最大步长数可以避免一些重复的遍历。
还能不能优化呢?是否每个元素都有必要遍历一遍?
重最优化的角度来讲,此题实质上是解决从极大值到极小值的最长路径的问题。即最长路径一定是从极大值到极小值的一条路径(从山顶走到山底)。那么我们可以先找出所有最小值或者最大值,然后使用深度优先搜索遍历这些点,这些路径中,最大的一条路径一定是整个图中最大的路径。这就衍生了第三个版本(从极小值往上搜,是个上山的过程)。
def isInside(row,col,i,j):
return (i in range(row)) and (j in range(col))
def isLocalMinima(data,row,col,i,j):
directs = [(-1,0),(1,0),(0,-1),(0,1)]
invalid_directs = [isInside(row,col,i+dx,j+dy) and data[i][j]&data[i+dx][j+dy] for (dx,dy) in directs]
return not any(invalid_directs)
def findLocalMinimaElements(data,row,col):
minima = []
for i in range(row):
for j in range(col):
if isLocalMinima(data,row,col,i,j):
minima.append((i,j))
return minima
def updateMap(data,Map,row,col,i,j):
directs = [(-1,0),(1,0),(0,-1),(0,1)]
for (dx,dy) in directs:
x,y = i+dx,j+dy
if(isInside(row,col,x,y) and data[x][y] & data[i][j] and Map[x][y] & Map[i][j]+1):
Map[x][y] = Map[i][j]+1
updateMap(data, Map,row,col,x,y)
def maxStep(data,row,col):
minima = findLocalMinimaElements(data,row,col)
Map = [[1 for j in range(col)] for i in range(row)]
for (min_x,min_y) in minima:
updateMap(data,Map,row,col,min_x,min_y)
print('the max step map is:')
[print(Map[i]) for i in range(row)]
return max([max(i) for i in Map])
if __name__=='__main__':
row,col = 6,6
data = [[32,
print(maxStep(data,row,col))
[4, 5, 2, 3, 2, 1]
[3, 2, 1, 2, 5, 6]
[4, 7, 2, 1, 4, 1]
[5, 6, 7, 2, 3, 4]
[6, 3, 2, 3, 4, 1]
[1, 4, 1, 2, 5, 2]
还能优化吗?
目前还没想到特别好的方法,只能以空间换时间。在对极小值进行深度优先搜索时,每个极小值可以独立使用一张图存储可行路径上每个元素的最大步数值。然后使用多线程跑,最优比较这些图中的最大值,即为最大步数。这个对大数据矩阵应该会有效果吧。
完整的测试代码放到github上了,有需要的可以下载:
没有更多推荐了,
加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!网站公告:
&&&&& 好彩HC6.com,诚信为本,市场在变,诚信永远不变...
  随着科技技术的不断发展,在信息化时代的今天,科技的创新,...
  在中国锁具制造市场中,中山市小榄镇素有南方锁城之称。它背...
  01.卷站门、铁卷门的锁心---容易被破坏。 02.一般普通的挂锁--...
  四川省茶业集团股份有限公司(以下简称川茶集团)于2013年10月成立,是以原四川省叙府茶业有限公司为主体联合省内多家茶叶企业共同发起组建的四川首家集茶树良种繁育、种植示范、茶叶初精深加工、品牌营销、科技研发与推广、茶文化应用与茶旅游发展以及其他茶叶关联产业等为一体的现代茶产业集群。 川茶集团是省、市、区各级党委政府重点扶持打造的农业产业化国家重点...
地址:这里是您的公司地址
电话:+86-
传真:+86-
24小时热线电话:+86-
地址:北京市幸福路109号  电话:+86-  传真:+86-
csdtq.cn 青岛大通区电气股份有限公司 版权所有  技术支持:  ICP备案编号:  统计代码放置网站公告:
&&&&& 好彩HC6.com,诚信为本,市场在变,诚信永远不变...
  随着科技技术的不断发展,在信息化时代的今天,科技的创新,...
  在中国锁具制造市场中,中山市小榄镇素有南方锁城之称。它背...
  01.卷站门、铁卷门的锁心---容易被破坏。 02.一般普通的挂锁--...
  四川省茶业集团股份有限公司(以下简称川茶集团)于2013年10月成立,是以原四川省叙府茶业有限公司为主体联合省内多家茶叶企业共同发起组建的四川首家集茶树良种繁育、种植示范、茶叶初精深加工、品牌营销、科技研发与推广、茶文化应用与茶旅游发展以及其他茶叶关联产业等为一体的现代茶产业集群。 川茶集团是省、市、区各级党委政府重点扶持打造的农业产业化国家重点...
地址:这里是您的公司地址
电话:+86-
传真:+86-
24小时热线电话:+86-
地址:北京市幸福路109号  电话:+86-  传真:+86-
csdtq.cn 青岛大通区电气股份有限公司 版权所有  技术支持:  ICP备案编号:  统计代码放置幸运飞艇追号免费计划\幸运飞艇大小单双计划\幸运飞艇追号免费计划官网
请在此输入您的问题,祝您的问题早日得到解决!
首席金牌婚姻律师
丁嫣律师湖北 武汉
江苏首席法律专家
中华微律师江苏 南京
110法律援助热线
110法律服务律师北京 朝阳区
首席推荐律师
北京朝阳区
北京朝阳区
热门城市:
刑事类 - 刑事辩护 行政复议 取保候审..
经济类 - 房产纠纷 电信通讯 工程建筑..
涉外类 - 国际贸易 合资合作 海事海商..
公司类 - 公司收购 股份转让 破产解散..
- 工商查询 合同审查 资信调查..
地区法律咨询:
冯倩雯律师广东广州
年遇春律师广东深圳
陈晓云律师北京海淀区
陈铠楷律师四川成都
毕丽荣律师广东广州
张沂峰律师山东临沂
闫燕律师山东济南
杨冬梅律师浙江杭州
毕丽荣律师广东广州
杨冬梅律师浙江杭州
康治斌律师陕西西安
陈铠楷律师四川成都
李建成律师北京朝阳区
徐卫东律师北京海淀区
陈宇律师福建福州
地区案件委托:
近年来幸运飞艇追号免费计划对于离婚已经不是什么新鲜事了,随着我国经济的发展,离婚率也逐年增长。 全国上半年婚姻
民事案件分类
婚姻家庭专长律师
劳动纠纷专长律师
交通事故专长律师
合同纠纷专长律师
其它法律案件分类
刑事辩护专长律师
房产纠纷专长律师
专业法律导航求一个北京28准确的组合算法或者单双算法_百度知道
求一个北京28准确的组合算法或者单双算法
我有更好的答案
하는
采纳率:66%
방문할 때
1条折叠回答
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。}

我要回帖

更多关于 腾讯广告算法大赛2017 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信