2462. 雇佣 K 位工人的总代价;948. 令牌放置;1262. 可被三整除的最大和

2462. 雇佣 K 位工人的总代价

核心思想:分情况讨论,当2*candidates >= n 时,直接取前k个工人即可;当2*candidates< n时,我们可以维护两个最小堆,然后不断比较堆中的值,然后用i,j两个指针表示放入堆中的值。

2462. 雇佣 K 位工人的总代价;948. 令牌放置;1262. 可被三整除的最大和_第1张图片

 948. 令牌放置

核心思想:贪心+模拟,如果power够的话,直接用power换分数,power不够的话,再用分数换power,换最多的power,然后统计这个过程中分数出现的最大值。

2462. 雇佣 K 位工人的总代价;948. 令牌放置;1262. 可被三整除的最大和_第2张图片

 1262. 可被三整除的最大和

核心思想:动态规划,但是做的时候用的是记忆化搜索,就是对于nums[i]这个数,我们选还是不选,定义dfs(i,j)表示nums[0:i]被三相除余数为j的最大和,那么dfs(i,j) = max(dfs(i-1,j),选),选的话就是dfs(i-1,j')+nums[i],j'和j相加等于三,然后就是终止条件,dfs(-1,0),dfs(-1,1),dfs(-1,2),如果搜索到最后两种是不合法的设为-inf,dfs(-1,0)为0,使用这种记忆化搜索还可以求出被k相除的最大和,只需要对j进行改动即可。然后代码中有个j+nums[i],一般理解都是j-nums[i]会有点误区,因为最后都递归到0,所以-+无差别。

2462. 雇佣 K 位工人的总代价;948. 令牌放置;1262. 可被三整除的最大和_第3张图片

 

你可能感兴趣的:(深度优先,算法)