百度3.13-算法岗笔试AK

1. 字符串异或运算

只需要判断字符串中不连续的1的个数就行

2. 删除游戏

描述:

假设输入一个数组nums,其中的元素大于0小于100000

题目要求做的是:最大化结果分数score

如果选中一个数i的话,就将其添加到结果分数中,即(score+ i * freq(i出现的频率)),那么 i - 1和i + 1就不能被选择。

解法:

动态规划。

维护两个dp数组left_dp,right_dp

left_dp[i][0]表示从1到 i 位置不选中 i 元素获得的最大分数

left_dp[i][1]表示从1到 i 位置选中 i 元素获得的最大分数

要注意的是元素频率为0可以直接继承前一个状态的最大值,

即 left_dp[i][0] = left_dp[i][1] = max(left_dp[i - 1][0], left_dp[i - 1][1])

left_dp[i][0] = max(left_dp[i - 1][0], left_dp[i - 1][1])

left_dp[i][1] = left_dp[i - 1][0] + i * (i出现的频率)

right_dp[i][0]表示从max_value(数组中的最大值)到 i 位置不选中 i 元素获得的最大分数

right_dp[i][1]表示从max_value(数组中的最大值)到 i 位置选中 i 元素获得的最大分数

right_dp[i][0] = max(right_dp[i + 1][0], right_dp[i + 1][1])

right_dp[i][1] = right_dp[i + 1][0] + i * (i出现的频率)

最后的结果需要遍历dp数组,为max(left_dp[i][1] + right_dp[i][1] - i * i出现的频率))

最后的减号是因为元素 i 被选中了两次。

不使用right_dp应该也能过,只需要注意频率为0的元素的影响就行

#我的实习求职记录#
全部评论
def delGame(a): record = [0] * 100010 dp = [0] * 100010 for num in a: record[num] += 1 dp[1] = record[1] for i in range(1, 100010): dp[i] = max(dp[i-2]+i*record[i], dp[i-1]) print(dp[-1])
3 回复 分享
发布于 2023-03-14 19:39 北京
佬用Python写的吗
1 回复 分享
发布于 2023-03-14 13:26 广东
我第二题,没想到用连续的dp,只建立了长为len(count.keys())的dp数组,count input得到频率字典之后,把keys排序然后遍历keys....最后过了27% 是不是时间超时了啊,我自己试了一下结果都对。难顶
1 回复 分享
发布于 2023-03-14 00:34 美国
第二题wa了,看出来是dp了,但是感觉难度还是有的,有点难顶
1 回复 分享
发布于 2023-03-14 00:23 北京
问问博主现在算法岗对应届生都什么要求了
点赞 回复 分享
发布于 2024-04-05 21:30 福建
感谢大佬分享,学习一下
点赞 回复 分享
发布于 2023-03-15 15:03 四川
佬真的太强啦
点赞 回复 分享
发布于 2023-03-15 15:00 山东
你好,编程题是本地写还是平台,或者是手写呢?
点赞 回复 分享
发布于 2023-03-15 11:05 北京
为什么一定要rightdp呢
点赞 回复 分享
发布于 2023-03-14 11:32 北京
第二题拿回溯写的 没ac 不知道是不是超时了 后面想到可以用类似动态规划的方法剪枝 但没来得及写了
点赞 回复 分享
发布于 2023-03-14 00:59 上海
忘了一个要点😂😂,元素频率为0的话,当前状态可以直接继承前一个状态的最大值
点赞 回复 分享
发布于 2023-03-14 00:01 湖北

相关推荐

评论
9
35
分享

创作者周榜

更多
牛客网
牛客企业服务