4月12日 小红书后端笔试编程题解

选择题跳过。
编程题三题
T1 签到,排序去重即可。

T2 问刚好等于x。考虑01背包(下标从1开始)。
dp[i][j][k]表示到第i个数,总共选取了j个,k=0表示[1~i]都没多次操作(都没加倍)。k=1表示[1~i]存在加倍的情况,可能是i,也可能是之前的某次。
列出状态转移方程:
dp[i][j][0] = min(dp[i-1][j][0], dp[i-1][j-a[i]/2][0]+1) 表示不选和选的情况。
dp[i][j][1] = min(dp[i-1][j][1], dp[i-1][j-a[i]/2][1]+1, dp[i-1][j-a[i]][0]+1) 表示不选、选择但是不多次操作、选择并多次操作的情况。
最后输出min(dp[n][x][0],dp[n][x][1])即可,若为inf则输出-1.
第一维可以优化掉,空间O(x),时间O(nx)。

T3 样例给的比较号是&amp;lt;和&amp;gt;这种,很神秘,最后发现直接改成<和>都行。
也考虑dp。
先把等号去掉,那个不影响答案。
假设有len个运算符
dp[i][j]表示到第i个运算符右侧的数,选择j,所得到的方案数。
如果第i个运算符是 > ,说明右侧的数更小,则 dp[i][j] = dp[i-1][j+1] + dp[i-1][j+2] + ... + dp[i-1][m]
如果第i个运算符是 < ,说明右侧的数更大,则 dp[i][j] = dp[i-1][j-1] + dp[i-1][j-2] + ... + dp[i-1][1]
初始化dp[0][1~m] = 1,表示最左侧的数取任何数的方案数都是1
最后对dp[len][1~m]求和即可。

当然直接算会超时,毕竟要求和。
实际上如果第i个运算符是 >,那么由于dp[i][j+1] = dp[i-1][j+2] + ... + dp[i-1][m],因此dp[i][j] = dp[i][j+1] + dp[i-1][j+1]。
同理如果第i个运算符是 < ,那么dp[i][j] = dp[i][j-1] + dp[i-1][j-1]。
由于i只用到2个,因此可以压缩一维到大小为2.
最后空间复杂度O(2*m) = O(m),时间复杂度O(n*m)

#笔试##小红书#
全部评论
*,看牛客才发现第二题是原题(
1 回复 分享
发布于 2024-04-12 21:20 广东
我第三题用的回溯一直报runtime error过不全不会是因为超时吧
点赞 回复 分享
发布于 2024-04-12 21:12 陕西
好吧,最后一题dp的时候我还是累加的,难怪超时了
点赞 回复 分享
发布于 2024-04-12 21:05 江苏
大佬交卷早啊,题解就出来了
点赞 回复 分享
发布于 2024-04-12 21:03 上海

相关推荐

珩珺:那些经历都太大太空了,实习的情况不了解,大创项目连名字、背景、目的及意义都没体现出来;地摊经济更是看完连卖的什么产品都不知道,项目成果直接写营收多少都更直观真实一点;后面那个校文体部的更是工作内容是组织活动整理流程,成果变成了当志愿者,而且你们学校本科学生会大一入学就直接当部长吗,志愿里面还提到了疫情防控,全面解封是22年12月的事情,可能时间上也有冲突。可能你花了钱人家就用AI给你随便写了点内容改了一下,没什么体现个性化的点
点赞 评论 收藏
分享
评论
1
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务