leetcode:2926. 平衡子序列的最大和 【树状数组维护最大前缀和】

题目链接

lc2926

题目描述

题目思路

定义bi = numsi - i

目标是从b中找到一个非降子序列使得元素和最大

bi = numsi - i

找到b的一个非降子序列使得元素和最大

fi: 子序列最后一个数下标是i,对应的最大子序列

fi = max (max fj, 0) + numsi (j < i and bj <= bi)

也就是维护fj的前缀最大值

10 ** 9: 离散化处理 + 重新标序号

ac code

python 复制代码
# 树状数组模板(维护前缀最大值)
class BIT:
    def __init__(self, n: int):
        self.tree = [-inf] * n

    def update(self, i: int, val: int) -> None:
        while i < len(self.tree):
            self.tree[i] = max(self.tree[i], val)
            i += i & -i

    def pre_max(self, i: int) -> int:
        mx = -inf
        while i > 0:
            mx = max(mx, self.tree[i])
            i -= i & -i
        return mx


class 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的最大值
            

树状数组维护前缀最大值模版

python 复制代码
# 树状数组模板(维护前缀最大值)
class BIT:
    def __init__(self, n: int):
        self.tree = [-inf] * n

    def update(self, i: int, val: int) -> None:
        while i < len(self.tree):
            self.tree[i] = max(self.tree[i], val)
            i += i & -i

    def pre_max(self, i: int) -> int:
        mx = -inf
        while i > 0:
            mx = max(mx, self.tree[i])
            i -= i & -i
        return mx
相关推荐
变量未定义~3 小时前
最小生成树1(Prim模板)、最小生成树2(kruskal模板)、最近公共祖先(模板)
算法
这就是佬们吗3 小时前
Python入门⑤-异常处理、文件操作与实战项目
开发语言·数据库·python·算法·pycharm
LONGZETECH3 小时前
新能源汽车充电设备装配与调试仿真教学软件 技术架构与核心实现解析
大数据·算法·3d·unity·架构·汽车
自学小白菜3 小时前
关于提升机器学习算法做预测回归任务精度的方法分享
算法·机器学习·回归·提升精度
学废了wuwu4 小时前
从入门到实战:深入浅出模型压缩三大核心——剪枝、彩票假设与知识蒸馏
人工智能·算法·剪枝
小肝一下4 小时前
3. 单链表
c语言·数据结构·c++·算法·leetcode·链表·dijkstra
劈星斩月4 小时前
监督学习算法 之 决策树
学习·算法·决策树
学计算机的计算基4 小时前
操作系统内存管理全解:虚拟内存、页表、COW、malloc、OOM一篇搞定
java·笔记·算法
tachibana24 小时前
hot100 前 K 个高频元素(347)
java·数据结构·算法·leetcode
陈天伟教授4 小时前
暴力美学-大型语言模型与涌现:一个复杂系统视角
人工智能·算法