算法工程师机试题目-拣货问题

去年帮师兄做机试题的时候遇到了一道比较有意思的题,内容为一个快递员按照从大到小的顺序在方阵中进行拣货,问怎么能够捡最多的货。后来同学给我共享了一篇博客,分享了两种结题思路,都很不错,但是和我当时做的方法有所不同,所以共享一下我当时的答案。

原始题目如下:

沐哲是一个菜鸟仓库的一个拣货员,但他有非常个怪异的习惯。每次拣货的重量都要比之前拣的一个轻,每次拣到货后都可以得到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可以拣的货更多。这也是赚钱最多的一条路径.
要求
输入行数、列数和数据矩阵,输出所赚的最大钱数。

import numpy as np
net =   [[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 ]]
v_v = [(0,-1),(0,1),(1,0),(-1,0)]
w = len(net)
h = len(net[0])
net_vector = sum(net,[])
id_list = list(range(w*h))
paixu = sorted(zip(net_vector, id_list))
label = [[1]*h for i in range(w)]
mark =[net[i][:] for i in range(w)]
for i in range(w*h):
    i_x = paixu[i][1]//h
    i_y = paixu[i][1]%h
    v_label = [0]*4
    for i_v in range(len(v_v)):
        i_x_v = i_x + v_v[i_v][0]
        i_y_v = i_y + v_v[i_v][1]
        if i_x_v >= 0 and i_x_v < w and i_y_v >= 0 and i_y_v < h:
            if net[i_x_v][i_y_v]>net[i_x][i_y]:
                label[i_x_v][i_y_v] = max(label[i_x][i_y]+1,label[i_x_v][i_y_v])
                mark[i_x_v][i_y_v] = max(mark[i_x][i_y]+net[i_x_v][i_y_v],mark[i_x_v][i_y_v] )
for x in label: print(x)
print(max(sum(label,[])))
for x in mark: print(x)
print(max(sum(mark,[])))
for x in net: print(x)


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值