1186. 删除一次得到子数组最大和
解题思路:如果没做过还不是很好想,当时自己第一反应是双指针,结果是个动态规划的题。
核心就是dp的定义,dp[i][k]表示以arr[i]结尾删除k次的最大和。看到这里其实就有一点思路了
dp[i][0]表示以arr[i]结尾删除0次的最大和;
dp[i][1]表示以arr[i]结尾删除1次的最大和,我们只需要统计max(dp[i][0],dp[i][1])即可。
dp[i][0] = dp[i-1][0]+arr[i](保留arr[i]之前的),arr[i](不保留arr[i]之前的)(有点不好理解,可以理解为如果前面结果为负数,直接从arr[i]开始重新计数)
dp[i][1] = dp[i-1][0](删arr[i]),dp[i-1][1]+arr[i](不删arr[i])
注意:dp0和dp1的顺序
1711. 大餐计数
解题思路:当时看到10的9次方,以为是动态规划的题目。
核心:就是枚举每一个数,然后统计它的左边出现过的可以和它形成2次幂的数出现的个数(这里是通过枚举2,4,8....来统计出现过的数,即是value不断左移就相当于value在不断乘以2,它的上限是最大值的两倍),然后把它放入cnt。
1834. 单线程 CPU
解题思路:其实读完题目后,发现人脑可以很清楚的模拟cpu的行为,即把需要执行的任务放入cpu中,然后cpu选择执行时间短的任务去做,但是当你想用代码实现的时候发现处理起来还是有点难度。
核心:1.时间戳,有了这个你就可以知道,当任务的开始小于时间戳的时候,你需要把任务放入cpu中;2.指针,这个是为了让我们执行到每一个任务;3.将任务按照开始时间排序并和它的下标对应,因为输出结果需要输出下标。4.最小堆,我们需要一个最小堆来存储我们放入的任务,然后执行完一个后,弹出执行时间最少的那个。
文章来源:https://www.toymoban.com/news/detail-596592.html
文章来源地址https://www.toymoban.com/news/detail-596592.html
到了这里,关于1186. 删除一次得到子数组最大和;1711. 大餐计数;1834. 单线程 CPU的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!