拼多多3/30思路

1-闯关
dp[i]=max(dp[i],dp[j-1]+val[i]); //满足条件 ch[j]=='b'&& kind[j] == kind[i]
① 可以暴力枚举i,j,当然这样写是O(n*n),需要优化
②  定义一个vector<int> vec[kind]存下标pos,其中下标满足ch[pos]=='b'&&kind[pos]==kind,这样能卡过(1700ms通过)就没继续优化了。
③ 继续优化可以发现对于一个kind,不需要遍历②的所有pos,而只需找到最大的dp[pos-1]即可,那么就可以继续优化到O(n)
--------------
2-最少施工队
树形dp,转移方程
dp[fa]+=(dp[son]==0? cost[{fa,son}]:dp[son])
① dp[i]表示以i的子树所需的施工队,cost[{fa,son}]表示fa-son这条边是0还是1
② 解释下方程,如果son子树已经需要派施工队去,那么fa-son这条边就不需要多的施工队了,否则看该边是0还是1
--------------
3-连续子数组最大乘积
①可以发现0会把数组划分成一段一段,答案区间一定不会包含0
②假如全部是正数,那么区间的乘积可以用2的幂次表示,所以记录2的幂次和即可(mp[8]=3,mp[4]=2)
②对于一段不含0的区间,需要让负号为偶数,所有如果区间是奇数个负数,那么就删去左边第一个负数 或者 右边第一个负数。
我的做法是用map<pair<int,int>,int> >mp存下所有的合法区间,mp[{l,r}]=sum,然后遍历mp求值。
tips:输出-1的数据只有6%,通过94%或者96%可能是因为下面的数据
--------------
5         |    5    
1 1 1 1 1   |   1 -1 1 1 1
4-最少操作
①从后往前构造,如果a[n]这个数被置为0会怎么样。
②a[n]不用置为0是数组什么情况
实际上只有 2 3  1 4 4 4 5 5这样的才会说少用次数,不需要去消除4和5,而 2 4 3 1 4 4  5就不能保留4 。
倒着去求就可以
--------------
代码是再牛客上直接写的,本地没有保存
全部评论
大佬
1 回复 分享
发布于 2023-03-30 18:04 湖南
欢迎补充
点赞 回复 分享
发布于 2023-03-30 17:48 湖北

相关推荐

10-06 12:46
门头沟学院 Java
跨考小白:定时任务启动
点赞 评论 收藏
分享
Bug压路:老哥看得出来你是想多展示一些项目,但好像一般最多两个就够了😂页数一般一页,多的也就2页;这些项目应该是比较同质化的,和评论区其他大佬一样,我也觉得应该展示一些最拿手的(质量>数量)😁😁😁专业技能部分也可以稍微精简一些
点赞 评论 收藏
分享
6 6 评论
分享
牛客网
牛客企业服务