百度笔试编程题小红操作01序列

我想问下谁做出来了呀,能讲讲思路吗?关键是不知道如何计算操作k步后01反转后01序列的最大数。
我的设想是如果串里有0有1的话,记录首尾位置,看首位是不是0,末位是不是1,但是当首位是1,末位是0这要怎么办啊。如果暴力求解,每个位置都尝试操作一次,那么当操作不同位置的变化量一样怎么办啊?求大佬指导
全部评论
只看到了题目,口糊了一个做法供大家讨论,如果有正解了求求踢我一下我也好奇,遍历原串s,dp[i][j][k]代表到第i位为止,已经进行了j次修改,到i为止(包含i)有k个0的情况下得到的收益,那么对于一组确定的ijk,收益也是确定的,答案为dp数组在i=n时的max,状态转移部分第i项只会用到第i-1项,所以可以省略i这一维度滚动优化,同时使用map只维护合法解来避免n^3遍历i*j*k,那么其实只有四种情况,状态转移如下 当前位是0不变,ndp[j][k+1]=dp[j][k]; 当前位是1不变,ndp[j][k]=dp[j][k]+k; 当前位是0改变,ndp[j+1][k]=dp[j][k]+k; 当前位是1改变,ndp[j+1][k+1]=dp[j][k]; 因为如果当前位最终是0,那么只会让k+1,答案直接继承,如果当前位最终是1,会与之前的所有0构成01子序列,会对答案提供k个贡献 检查一下发现n是3000复杂度合理,维护方式不止这一个,也可以提前预处理出原串到第i位有多少个0,dp[j][k]代表到第i位修改了j个1,k个0,应该也是合法的
点赞 回复 分享
发布于 11-06 01:00 黑龙江
只过了23%😂
点赞 回复 分享
发布于 11-06 14:16 辽宁

相关推荐

1 收藏 评论
分享
牛客网
牛客企业服务