欢迎光临散文网 会员登陆 & 注册

复盘|第353场周赛

2023-07-09 23:25 作者:UCLmsc  | 我要投稿

找出最大的可达成数字

【数学】t次操作,num+t = X-t,得num + 2 * t = X。

达到末尾下标所需的最大跳跃次数

【线性DP-记忆化搜索实现】倒着思考,从n-1倒着跳到0,每次跳跃可以把问题规模缩小,定义dfs(i)为从i跳到0的最大跳跃次数,还是“枚举选哪个”的思想,枚举j,如果abs(nums[i] - nums[j]) <= target,那么有dfs(i) = dfs(j) + 1。取所有情况最大值即为dfs(i),没有j则dfs(i) = -inf。递归入口dfs(n-1),递归边界dfs(0)。

【线性DP-递推实现】

构造最长非递减子数组

【线性DP-记忆化搜索实现】定义dfs(i, j)为以numsj[i]结尾的最长非递减子数组的长度,用“枚举选哪个”的思想,如果nums1[i - 1] ≤ numsj[i],下一步选nums1[i - 1],有dfs(i,j) = dfs(i -1,0) + 1;如果nums2[i - 1] ≤ numsj[i],下一步选nums2[i - 1],有dfs(i,j) = dfs(i -1,1) + 1,ans=max(dfs(i,j) for ....),递归入口dfs(i,j),递归边界dfs(0) = 1。

【线性DP-递推实现 空间优化】由于 f[i]只用到f[i-1],所以可以去掉第一个维度。

使数组中的所有元素都等于零

【差分数组】子数组同时减去一个数,适合用差分数组来维护,设差分数组为diff,把nums[i]到nums[i+k-1]同时减去1,等价于把diff[i]减一,diff[i+k]加1,注意到子数组长度必须恰好等于k,所以当i+k≤n时,才能执行上述操作。遍历数组同时,用diff_sm累加差分值,遍历到nums[i]时,nums[i]+diff_sm就是nums[i]的实际值了,分类讨论:如果nums[i]<0,无法让元素值增大,返回false;如果nums[i]=0,无需操作遍历下一个数,如果nums[i]>0:i+k>n则无法操作返回false;I+k≤n,修改差分数组遍历下一个数。


复盘|第353场周赛的评论 (共 条)

分享到微博请遵守国家法律