【最大上升子序列和】

news2024/11/13 14:57:07

题目

在这里插入图片描述


前置芝士

1. erase 函数
erase(iterator pos):删除单个元素,其中 pos 是要删除元素的迭代器。
erase(iterator first, iterator last):删除从 first 到 last(不包括 last)之间的所有元素。

2. unique 函数
unique 函数用于去除容器中相邻的重复元素,并返回一个迭代器,指向去重后容器中最后一个有效元素的下一个位置。
unique(iterator first, iterator last):处理从 first 到 last(不包括 last)之间的元素。
3. lower_bound 函数
lower_bound(iterator first, iterator last, const T& value):在从 first 到 last(不包括 last)之间的元素中查找第一个大于等于 value 的元素的位置,返回对应迭代器it,如果不存在则返回.end()


思路

如果数据足够小,可以采用二重循环+dp

状态定义:
f [ i ] 对应 1 到 i 号元素形成的序列中,包括第 i 个元素的所有上升子序列的集合 f[i]对应1到i号元素形成的序列中,包括第i个元素的所有上升子序列的集合 f[i]对应1i号元素形成的序列中,包括第i个元素的所有上升子序列的集合
f [ i ] 表示和的最大值 f[i]表示和的最大值 f[i]表示和的最大值

状态转移:
f [ j ] = m a x    1 < = i < j = n , a [ i ] < a [ j ] ( f [ i ] ) + a [ j ] f[j] = max_{\;1<=i<j=n, a[i] < a[j]}(f[i]) + a[j] f[j]=max1<=i<j=n,a[i]<a[j](f[i])+a[j]

目标状态:
m a x    1 < = i < = n ( f [ i ] ) max_{\;1<=i<=n}(f[i]) max1<=i<=n(f[i])

树状数组优化状态转移:
从求前缀和转求前缀最大值
m a x    1 < = i < j = n , a [ i ] < a [ j ] ( f [ i ] ) = q u e r y ( x − 1 ) ,    m a p p i n g ( a [ i ] ) = x max_{\;1<=i<j=n, a[i] < a[j]}(f[i]) = query(x-1), \;mapping(a[i]) = x max1<=i<j=n,a[i]<a[j](f[i])=query(x1),mapping(a[i])=x

数组下标表示数值大小 不可以, a [ i ] ∈ [ 1 , 1 0 9 ] a[i]\in[1,10^{9}] a[i][1,109]

离散化:从存储值域转为存储实际存在的值,数的大小关系仍由下标体现,但范围不再离散且那么大,转而连续且取决于数的个数
步骤

  1. 排序 sort(g.begin(), g.end());
  2. 去重 g.erase(unique(g.begin(), g.end()), g.end());
  3. 映射函数mapping(将原始下标映射为离散化存储后的下标) int x = lower_bound(g.begin(), g.end(), a[i]) - g.begin() + 1;

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 1e5+10;
vector<int> g;
int a[N];
LL tr[N], f[N];
int n, m;
int lowbit(int x)
{
    return x & -x;
}
void add(int x, LL d)
{
    for(; x <= m; x += lowbit(x)) tr[x] = max(tr[x], d);
}
LL query(int x)
{
    LL retval = 0;
    for(; x; x -= lowbit(x)) retval = max(retval, tr[x]);
    return retval;
}
int main()
{
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i], g.push_back(a[i]);
    
    sort(g.begin(), g.end());
    g.erase(unique(g.begin(), g.end()), g.end());
    m = g.size();
    
    for(int i = 1; i <= n; i++)
    {
        int x = lower_bound(g.begin(), g.end(), a[i]) - g.begin() + 1;
        f[i] = query(x-1) + a[i];
        add(x, f[i]);
    }
    
    LL res = 0;
    for(int i = 1; i <= n; i++) res = max(res, f[i]);
    cout << res;
    
    return 0;
    
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2098266.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

emmc协议

一、简介 1.1 简介 嵌入式多媒体卡&#xff08;Embedded Multimedia Card, eMMC&#xff09;是由 JEDEC 协会所订立&#xff0c;将 MMC controller 和 NAND Flash 封装到一个芯片中&#xff0c;简化存储器的使用和电路板的设计。 1.2 信号 singledescriptionclkclockdata…

Qt22双缓冲机制

Qt22双缓冲机制 知识点drawwidgetdrawwidget.hdrawwidget.cpp mainwindowmainwindow.hmainwindow.cpp main.cpp运行图 知识点 双缓冲就是在内存区申请一块缓存&#xff1b;然后显卡直接从这块内存读取数据.。 这样就不用鼠标边画&#xff0c;经过IO来读取这个环节&#xff1b;…

2024杭电6

1001.造花&#xff08;简单版&#xff09; 题意&#xff1a; 菊花图&#xff1a;n-1个节点都连接同一节点的树。 给定一棵树&#xff0c;删掉一个节点和连向这个点的所有边&#xff0c;使剩下两个连通块都构成菊花图&#xff0c;问是否可以做到。 题解&#xff1a; 菊花图只有…

算法练习题07:无重复字符的最长子串

我们可以使用 滑动窗口 的方法来解决这个问题。这是一种高效的算法&#xff0c;能在 O(n) 的时间复杂度内完成任务。以下是具体的解题思路&#xff1a; 1. 滑动窗口的概念 滑动窗口的想法是使用两个指针&#xff08;通常称为左指针 i 和右指针 j&#xff09;来表示一个窗口。…

秋招/春招投递公司记录表格

最近在准备秋招&#xff0c;在各个平台投递秋招简历&#xff0c;什么官网&#xff0c;邮箱&#xff0c;boss&#xff0c;应届生各个平台上&#xff0c;投递的平台比较多&#xff0c;比较乱&#xff0c;因此自己想将这些平台投递记录都收集到一个表格上&#xff0c;所以在腾讯文…

基于Java+MySQL实现在线书店订购系统

一、引言 1.1 编写目的 编写详细设计说明书是软件开发过程必不可少的部分&#xff0c;其目的是为了使开发人员在完成概要设计说明书的基础上完成概要设计规定的各项模块的具体实现的设计工作。同时也是开发人员和最终客户进行需求交流的有效手段。 1.2 背景 开发软件系统名…

数据结构——排序上

1.排序的概念及其运用 1.1排序的概念 排序&#xff1a;所谓排序&#xff0c;就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作 稳定性&#xff1a;假定在待排序的记录序列中&#xff0c;存在多个具有相同的关键字的记录&a…

多目标应用:基于自组织分群的多目标粒子群优化算法(SS-MOPSO)的移动机器人路径规划研究(提供MATLAB代码)

一、机器人路径规划介绍 移动机器人&#xff08;Mobile robot&#xff0c;MR&#xff09;的路径规划是 移动机器人研究的重要分支之&#xff0c;是对其进行控制的基础。根据环境信息的已知程度不同&#xff0c;路径规划分为基于环境信息已知的全局路径规划和基于环境信息未知或…

美国海外仓可以用哪家海外仓系统好?

随着全球贸易的增长&#xff0c;美国已经成为了海外仓储业务的一个重要市场。美国海外仓的数量不断增加&#xff0c;竞争也愈加激烈。为应对这种竞争&#xff0c;并优化仓储和供应链管理&#xff0c;WMS&#xff08;仓库管理系统&#xff09;成为了海外仓的重要工具。 一、WMS…

Wx64ST:一款轻松可修改的C语言Shellcode模板

关于windows_x64_shellcode_template windows_x64_shellcode_template简称为Wx64ST&#xff0c;它是一款功能强大的Shellcode模板&#xff0c;该模板基于C语言编写&#xff0c;其简单、可扩展和易于修改等特性可以帮助广大安全研究人员轻松开发适用于Windows x64的Shellcode。…

kali (linux) 安装配置 共享文件夹 samba

一、samba 安装 sudo apt-get install samba 二、启动samba 服务 systemctl enable nmb systemctl enable smb systemctl start nmb systemctl start smb 三、查看 samba状态 systemctl status nmb systemctl status smb 四、创建共享文件夹 &#xff0c;并修改权限 …

技术指南:5分钟零成本实现本地AI知识库搭建

你一定经历过各种通用大模型一本正经胡说八道的时候吧&#xff0c;AI一通丝滑输出让人真假难辨&#xff0c;防不胜防。这种情况被称为AI幻觉。 大模型产生幻觉不幸“翻车”的原因很大程度上是“先天不足”&#xff0c;例如训练时来自特定领域的训练数据就比较缺失或存在偏差等…

20-22 - 打造专业的编译环境

---- 整理自狄泰软件唐佐林老师课程 文章目录 1. 大型项目的编译&#xff08;无第三方库&#xff09;1.1 大型项目的目录结构&#xff08;无第三方库&#xff09;1.2 项目结构设计分析1.3 需要打造的编译环境1.4 解决方案设计 2. 第 1 阶段任务2.1 关键的实现要点2.2 模块 make…

MES管理系统如何提升产品质量与可追溯性

在智能制造的新纪元里&#xff0c;MES管理系统正逐步崭露头角&#xff0c;成为驱动制造业转型升级的幕后英雄。MES管理系统不仅重新定义了生产过程的管理与控制方式&#xff0c;还以数据为驱动&#xff0c;引领着制造业迈向更高效、更智能、更可持续的未来。 智能制造的赋能者&…

U-Mail垃圾邮件过滤网关‍是如何过滤垃圾邮件的?

随着互联网的普及&#xff0c;垃圾邮件已经成为计算机网络安全的又一个公害。因此&#xff0c;反垃圾邮件已经成为互联网应用研究中一个重要课题。为了防止垃圾邮件首先要学会保护自己的邮件地址&#xff0c;避免在网上随意登记和使用邮件地址&#xff0c;预防垃圾邮件骚扰。其…

ALV Tree Control树控件

ALV Tree Control CL_GUI_ALV_TREE 效果&#xff1a; 自定义函数调用&#xff0c;在函数里画屏幕定义树控件显示 FUNCTION ZFI_YSYWLX_HELP_NEW . *"---------------------------------------------------------------------- *"*"本地接口&#xff1a; *&qu…

zset使用lua实现取最高分数中的随机成员

zset使用lua实现取最高分数中的随机成员 这种场景适用队列中不想要先入先出、先入后出因为zset的命令都是带有排序功能的&#xff0c;所以取值时要不从大到小要不从小到大所以我使用lua实现随机取成员使用lua是因为可以保持原子性在执行过程中Lua脚本是不会被其他命令或请求打…

C语言典型例题59

《C程序设计教程&#xff08;第四版&#xff09;——谭浩强》 题目&#xff1a; 例题4.11 译密码。为使电文保密&#xff0c;往往按一定规律将其转换为密码&#xff0c;收报人再按约定的规律将其译回原文。 例如&#xff0c;可以按以下规律将电文变为密码&#xff1a; 将字母A…

我不是非酋之-天空概率

最近入坑了dnf手游&#xff0c;染上了合天空&#xff0c;大黑蛋子一个&#xff0c;突发奇想&#xff0c;模拟下合天空概率&#xff0c;看看是否真的有20%。 梳理代码逻辑如下&#xff1a; 不考虑礼包和其他东西 条件&#xff1a; 合成概率20%&#xff0c;每次需要2个装扮和一个…