已解决
leetcode:2926. 平衡子序列的最大和 【树状数组维护最大前缀和】
来自网友在路上 188888提问 提问时间:2023-11-08 04:43:32阅读次数: 88
最佳答案 问答题库888位专家为你答疑解惑
题目链接
lc2926
题目描述
题目思路
定义b[i] = nums[i] - i
目标是从b中找到一个非降子序列使得元素和最大
# b[i] = nums[i] - i
# 找到b的一个非降子序列使得元素和最大
# f[i]: 子序列最后一个数下标是i,对应的最大子序列
# f[i] = max (max f[j], 0) + nums[i] (j < i and b[j] <= b[i])
# 也就是维护f[j]的前缀最大值
# 10 ** 9: 离散化处理 + 重新标序号
ac code
# 树状数组模板(维护前缀最大值)
class BIT:def __init__(self, n: int):self.tree = [-inf] * ndef update(self, i: int, val: int) -> None:while i < len(self.tree):self.tree[i] = max(self.tree[i], val)i += i & -idef pre_max(self, i: int) -> int:mx = -infwhile i > 0:mx = max(mx, self.tree[i])i -= i & -ireturn mxclass Solution:def maxBalancedSubsequenceSum(self, nums: List[int]) -> int:n = len(nums)# b[i] = nums[i] - i# 找到b的一个非降子序列使得元素和最大# f[i]: 子序列最后一个数下标是i,对应的最大子序列# f[i] = max (max f[j], 0) + nums[i] (j < i and b[j] <= b[i])# 也就是维护f[j]的前缀最大值# 10 ** 9: 离散化处理 + 重新标序号b = sorted(set(x - i for i, x in enumerate(nums)))t = BIT(len(b) + 1) # 经典初始化for i, x in enumerate(nums):j = bisect_left(b, x - i) + 1 # 找到b[i]离散化后的位置f = max(t.pre_max(j), 0) + x # 计算f[i]t.update(j, f)return t.pre_max(len(b)) # 所有f的最大值
树状数组维护前缀最大值模版
# 树状数组模板(维护前缀最大值)
class BIT:def __init__(self, n: int):self.tree = [-inf] * ndef update(self, i: int, val: int) -> None:while i < len(self.tree):self.tree[i] = max(self.tree[i], val)i += i & -idef pre_max(self, i: int) -> int:mx = -infwhile i > 0:mx = max(mx, self.tree[i])i -= i & -ireturn mx
查看全文
99%的人还看了
相似问题
- pandas定位选取某列某指标最大值所在的行记录,比如月底
- java中基本数据类型的最大值最小值理解
- LeetCode Hot100之十:239.滑动窗口最大值
- 239.滑动窗口的最大值
- 【踩坑及思考】浏览器存储 cookie 最大值超过 4kb,或 http 头 cookie 超过限制值
- 寻找二维数组的最大值和对应下标 | C语言代码
- 【蓝桥杯选拔赛真题08】C++最大值最小值平均值 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析
- python:逐像素处理遥感数据时间序列数据(求时间序列最大值、最大值所对应的索引、最大值所在的时间)
- 面试算法44:二叉树中每层的最大值
- 【Python 千题 —— 基础篇】列表最大值
猜你感兴趣
版权申明
本文"leetcode:2926. 平衡子序列的最大和 【树状数组维护最大前缀和】":http://eshow365.cn/6-35034-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!