Alibaba 7.27 笔试

第一题
第一题我压根就没看懂题目说的是什么意思...



第二题 就有一个人收藏古董,古董摆在n层的架子上,然后每一层的古董价值各不相同,要挑选出m个古董
1. 每次只能在每一层的两端挑选
2. 使得m个古董的总的价值最大

def main(n, m, value):

    opt = [[0] * (m+1) for i in range(n+1)] # initialize

    for i in range(1, n+1):
        for j in range(1, m+1):
            if j >= 2:
                if len(value[i-1]) >= 2:
                    opt[i][j] = max(opt[i-1][j-1] + value[i-1][0], opt[i-1][j-1] + value[i-1][-1], opt[i-1][j-2] + value[i-1][-1] + value[i-1][0])
                elif len(value[i-1]) == 1:
                    opt[i][j] = max(opt[i-1][j-1] + value[i-1][0])
            else:
                # j = 1
                if len(value[i-1]) >= 2:
                    opt[i][j] = max(value[i-1][0], value[i-1][-1]) + opt[i-1][j-1]
                else:
                    opt[i][j] = value[i-1][0] + opt[i-1][j-1]
    return opt[n][m]


算例
value = [
    [3, 2],
    [1, 4, 1, 5]
]

n = 2
m = 3

return 10


#笔试题目##阿里巴巴#
全部评论
第一题如果是相同数字,比如:111,那么相当于两人轮流清除最前面的,所以奇数长度niuniu,偶数长度niumei,如果是000111,111前面的000没影响,跟111是一样的,所以直接统计最后一个元素出现的次数,根据奇偶性输出就行,用l统计次数 if(nums[i] ! = nums[i-1]) l = 1; else l++; 最后 if(l % 2 == 1) niuniu; else niumie;  第二题刚开始也想过dp,但转移方程没想好,用了个长度为m的堆做的,太鸡儿菜了
点赞
送花
回复 分享
发布于 2020-07-27 20:37
我觉得第一题是只有数字成对出现时输出NIUMEI
点赞
送花
回复 分享
发布于 2020-07-27 20:47
秋招专场
校招火热招聘中
官网直投
112223344按照个数转换成2322这样的数组 如果数组中有奇数就肯定是第一个人获胜,这种思路可以吗
点赞
送花
回复 分享
发布于 2020-07-27 20:55
LZ,第二题的代码是全过了吗?求分享一下思路,谢谢
点赞
送花
回复 分享
发布于 2020-07-27 21:06

相关推荐

2 7 评论
分享
牛客网
牛客企业服务