【信息学奥赛一本通 C++题解】1285:最大上升子序列和
信息学奥赛一本通(C++版)在线评测系统
基础算法 第一节 动态规划的基本模型
1285:最大上升子序列和
“最大上升子序列和”问题课堂讲解
1. 理解题意
同学们,想象我们有一串数字,就像一串彩色的珠子,每个珠子上都标着一个数字,这就是题目里说的序列。比如有这样一串数字:(1),(7),(3),(5),(9),(4),(8)。
现在我们要从这串数字里挑出一些数字,这些数字要满足后面的数字比前面的数字大,这样挑出来的数字组成的新序列就叫上升子序列。比如说从上面那串数字里挑出(1),(3),(5),(9),这就是一个上升子序列。
我们的任务是在所有能挑出来的上升子序列里,找到数字加起来和最大的那个上升子序列,然后把这个最大的和告诉大家。要注意哦,最长的上升子序列,它的数字和不一定是最大的。就像数字序列(100),(1),(2),(3),最长的上升子序列是(1),(2),(3),但是数字和最大的上升子序列是(100),因为(100)比(1 + 2 + 3)的和要大。
2. 解题思路
我们可以用一种像搭积木一样的方法来解决这个问题,这种方法叫动态规划。
我们先给每个数字都想象有一个“小背包”,这个“小背包”里装着以这个数字结尾的最大上升子序列的和。一开始,每个数字自己就是一个长度为(1)的上升子序列,所以每个数字“小背包”里的和就是它自己的值。
然后呢,我们从第二个数字开始,一个一个地看。对于每个数字,我们回头看看它前面的那些数字。要是前面有个数字比它小,那就说明可以把这个小的数字和当前数字连起来,形成一个新的上升子序列。我们就把前面那个小数字“小背包”里的和,加上当前数字,得到一个新的和。我们比较一下,是原来这个数字“小背包”里的和大,还是新得到的和大,把大的那个存到当前数字的“小背包”里。
最后,我们看看所有数字的“小背包”,找出里面最大的那个和,这个和就是我们要找的最大上升子序列的和啦。
3. 解题步骤
- 输入数字序列:我们要先知道这串数字有多少个,也就是输入序列的长度(N)。然后把这串数字里的每个数字都一个一个地记下来,存到一个数组里。
- 初始化“小背包”:让每个数字的“小背包”(也就是存储以该数字结尾的最大上升子序列和的数组)里都先装上它自己的值,因为每个数字自己就是长度为(1)的上升子序列,和就是它本身。
- 更新“小背包”:从第二个数字开始,一个一个地看,对于每个数字,看看它前面比它小的数字,把前面小数字“小背包”里的和加上当前数字,和原来当前数字“小背包”里的和比较,把大的那个存到当前数字的“小背包”里。
- 找出最大和:看看所有数字的“小背包”,找出里面最大的那个和,这就是我们要的答案。
4. C++代码实现
#include <iostream> // 包含输入输出流的头文件,这样我们就能从键盘输入数字,把结果输出到屏幕上啦
using namespace std; int main() {int n; // 定义一个变量 n,用来存数字序列里有多少个数字cin >> n; // 从键盘输入数字的个数,存到 n 里int a[1005]; // 定义一个数组 a,用来存数字序列,最多能存 1005 个数字int dp[1005]; // 定义一个数组 dp,这就是我们说的“小背包”数组,用来存以每个数字结尾的最大上升子序列的和// 输入数字序列,并初始化“小背包”for (int i = 1; i <= n; i++) {cin >> a[i]; // 从键盘输入一个数字,存到数组 a 的第 i 个位置dp[i] = a[i]; // 把“小背包”数组 dp 的第 i 个位置初始化为当前数字 a[i]}// 更新“小背包”for (int i = 2; i <= n; i++) { // 从第二个数字开始看for (int j = 1; j < i; j++) { // 看看当前数字前面的所有数字if (a[j] < a[i]) { // 如果前面的数字 a[j] 比当前数字 a[i] 小// 比较 dp[i] 和 dp[j] + a[i] 的大小,把大的那个存到 dp[i] 里dp[i] = max(dp[i], dp[j] + a[i]); }}}int ans = 0; // 定义一个变量 ans,用来存最大上升子序列的和,先初始化为 0// 找出“小背包”数组里的最大值for (int i = 1; i <= n; i++) {ans = max(ans, dp[i]); // 比较 ans 和 dp[i] 的大小,把大的那个存到 ans 里}cout << ans << endl; // 把最大上升子序列的和输出到屏幕上return 0;
}
5. 知识点总结
- 数组:我们用了两个数组,(a)数组存原始的数字序列,(dp)数组存每个数字对应的“小背包”里的和。数组就像一个小抽屉,我们可以把很多东西(这里是数字)一个一个地放进去,还能按照顺序找到它们。
- 循环:循环就像一个勤劳的小工人,会按照我们的要求重复做一些事情。这里用了两层循环,外层循环一个一个地看数字,内层循环回头看前面的数字,这样就能更新每个数字的“小背包”啦。
- 动态规划:这是一种很厉害的解题方法,把大问题分成很多小问题,先解决小问题,再从这些小问题的答案里找到大问题的答案。在这个问题里,我们先算出每个数字对应的最大上升子序列的和,再从这些和里找出最大的,就是整个序列的最大上升子序列的和啦。
- 比较大小:用(max)函数来比较两个数的大小,找出大的那个数。这样就能更新“小背包”里的和以及最终的最大和答案啦。
相关文章:
【信息学奥赛一本通 C++题解】1285:最大上升子序列和
信息学奥赛一本通(C版)在线评测系统 基础算法 第一节 动态规划的基本模型 1285:最大上升子序列和 “最大上升子序列和”问题课堂讲解 1. 理解题意 同学们,想象我们有一串数字,就像一串彩色的珠子,每个珠子…...
深入了解 CSS 常用的样式
在网页开发中,CSS(层叠样式表)起着至关重要的作用,它可以让我们的网页变得更加美观和易于阅读。除了一些特定场景下的 CSS 样式,还有许多其他常用的 CSS 样式,下面就让我们一起来详细了解一下。 一、文本相…...
Web安全|渗透测试|网络安全
基础入门(P1-P5) p1概念名词 1.1域名 什么是域名? 域名:是由一串用点分隔的名字组成的Internet上某一台计算机或计算机组的名称,用于在数据传输时对计算机的定位标识(有时也指地理位置)。 什么是二级域名多级域名&am…...
OpenHarmony 系统性能优化——默认关闭全局动画
笔者最近发现,关闭OpenHarmony全局动画,系统UI的响应速度会极大的提升 1.全局动画的开关由系统属性persist.sys.arkui.animationscale来控制,默认为1。也就是 动画缩放 1x 2.如果让persist.sys.arkui.animationscale默认为0,也就是关闭的状态…...
C 程序多线程拆分文件
C 程序多线程拆分文件 在C语言中,实现多线程来拆分文件通常需要借助多线程库,比如 POSIX 线程库(pthread)或者 Windows 的线程库(CreateThread 或类似的函数)。下面我将分别展示在 Linux 和 Windows 环境下…...
【Linux】Ubuntu Linux 系统——Python集成开发环境
ℹ️大家好,我是练小杰,今天周四了,明天就周五了,再坚持坚持又能休息了!!😆 本文是有关Linux 操作系统中Python集成开发环境基础知识,后续将添加更多相关知识噢,谢谢各位…...
数据库加密全解析:从传输到存储的安全实践
title: 数据库加密全解析:从传输到存储的安全实践 date: 2025/2/17 updated: 2025/2/17 author: cmdragon excerpt: 数据加密是数据库安全的最后一道物理防线。传输层SSL/TLS配置、存储加密技术及加密函数实战应用,覆盖MySQL、PostgreSQL、Oracle等主流数据库的20+生产级加密…...
【Prometheus】prometheus结合domain_exporter实现域名监控
✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…...
计算机专业知识【软件开发中的常用图表:E - R图、HIPO、DFD、N - S、PAD详解】
在软件开发过程中,有许多种图表工具被用于不同阶段的设计和分析,帮助开发者更清晰地理解系统结构、数据流程和算法逻辑。下面将详细介绍E - R图、HIPO图、DFD图、N - S图和PAD图,包括它们的样子和用途。 一、E - R图(实体 - 联系…...
机器学习_13 决策树知识总结
决策树是一种直观且强大的机器学习算法,广泛应用于分类和回归任务。它通过树状结构的决策规则来建模数据,易于理解和解释。今天,我们就来深入探讨决策树的原理、实现和应用。 一、决策树的基本概念 1.1 决策树的工作原理 决策树是一种基于…...
Linux 命令行编辑快捷键
初学者在Linux命令窗口(终端)敲命令时,肯定觉得通过输入一串一串的字符的方式来控制计算是效率很低。 但是Linux命令解释器(Shell)是有很多快捷键的,熟练掌握可以极大的提高操作效率。 下面列出最常用的快捷…...
智能马达保护器:为工业电机安全运行保驾护航
在工业生产中,电动机作为核心动力设备,其稳定运行直接关系到生产效率与安全性。然而,复杂的工况环境、频繁启停和突发负载变化,常导致电机面临过载、缺相、短路等故障风险。安科瑞智能马达保护器凭借其智能化、高精度、多功能的设…...
-bash:/usr/bin/rm: Argument list too long 解决办法
问题概述 小文件日志太多导致无法使用rm命令,因为命令行参数列表的长度超过了系统允许的最大值。 需要删除/tmp目录下的所有文件,文件数量比较多。 ls -lt /tmp | wc -l 5682452 解决方法如下: 使用find -exec 遍历,然后执行删…...
深度集成DeepSeek大模型:WebSocket流式聊天实现
目录 5分钟快速接入DeepSeek大模型:WebSocket实时聊天指南创建应用开发后端代码 (Python/Node.js)结语 5分钟快速接入DeepSeek大模型:WebSocket实时聊天指南 创建应用 访问DeepSeek官网 前往 DeepSeek官网。如果还没有账号,需要先注册一个。…...
Python函数的函数名250217
函数名其实就是一个变量,这个变量就是代指函数而已函数也可以被哈希,所以函数名也可以当作集合中的元素,也可作为字典的key值 # 将函数作为字典中的值,可以避免写大量的if...else语句 def fun1():return 123 def fun2():return 4…...
QT基础二、信号和槽
一、什么是信号和槽? 1、简述 在Qt框架中,信号和槽(Signals and Slots) 是一种用于对象间通信的机制。它是一种非常强大且灵活的设计模式,广泛应用于事件驱动编程中。信号和槽机制允许对象之间以松耦合的方式进行交互…...
MongoDB between ... and ... 操作
个人博客地址:MongoDB between ... and ... 操作 | 一张假钞的真实世界 MongoDB中类似SQL的between and操作可以采用如下语法: db.collection.find( { field: { $gt: value1, $lt: value2 } } );...
C++虚函数:解锁多态的“动态密码
C虚函数:解锁多态的“动态密码” 开篇小故事:遥控器的“智能按钮” 假设你有一个万能遥控器,上面只有一个“开关”按钮: 按下时,电视会开机,空调会制冷,电灯会亮起。同一个按钮,却…...
【深度学习】计算机视觉(CV)-目标检测-Faster R-CNN —— 高精度目标检测算法
1.什么是 Faster R-CNN? Faster R-CNN(Region-based Convolutional Neural Network) 是 目标检测(Object Detection) 领域的一种 双阶段(Two-Stage) 深度学习方法,由 Ross Girshick…...
Blazor-父子组件传递任意参数
在我们从父组件传参数给子组件时,可以通过子组件定义的[Parameter]特性的公开属性进行传值,但是当我们需要传递多个值的时候,就需要通过[Parameter]特性定义多个属性,有没有更简便的方式? 我们可以使用定义 IDictionar…...
【原创】vue-element-admin-plus完成编辑页面中嵌套列表功能
前言 vue-element-admin-plus对于复杂业务的支持程度确实不怎么样,我这里就遇到了编辑页面中还要嵌套列表的真实案例,比如字典,主字典嵌套子信息,类似于一个树状结构。目前vue-element-admin-plus给出的例子是无法满足这个需求的…...
【深度学习】计算机视觉(CV)-目标检测-DETR(DEtection TRansformer)—— 基于 Transformer 的端到端目标检测
1.什么是 DETR? DETR(DEtection TRansformer) 是 Facebook AI(FAIR)于 2020 年提出的 端到端目标检测算法,它基于 Transformer 架构,消除了 Faster R-CNN、YOLO 等方法中的 候选框(…...
DeepSeek教unity------MessagePack-02
内置支持类型: 对象序列化 MessagePack for C# 可以序列化你自己定义的公共类或结构体类型。默认情况下,可序列化的类型必须用 [MessagePackObject] 属性进行注解,成员需要用 [Key] 属性进行注解。键可以是索引(整数)…...
【达梦数据库】disql工具参数绑定
前言 在达梦数据库的使用过程中尽管管理工具很好用,但是命令行工具还是有着得天独厚的优势,但是在参数绑定方面就没有管理工具做的更加完美,现在就汇总下disql 工具参数绑定的常用几种方式 disql 参数绑定 使用 ? select * from v$dm_in…...
H5应用抓包及调试技巧
由于图片和格式解析问题,可前往 阅读原文 在现代移动互联网时代,H5 应用以其跨平台、轻量化、快速迭代的特性,成为移动开发的重要一环。然而,随着功能的复杂化和用户体验要求的提升,H5应用的调试也面临着诸多挑战&…...
Django后台新建管理员
在 Django 中,新建管理员用户通常涉及使用 Django 自带的命令行工具 manage.py。以下是具体步骤: 前提条件 Django 项目已创建:确保你已经创建了一个 Django 项目和应用。数据库已迁移:确保你已经运行了 python manage.py migra…...
输入网址到网页显示,发生了什么?
从今天起,我准备在网上输出自己的八股了 浏览器解析URL: 根据URL解析 请求协议(http),请求的服务器(www.baidu.com),请求的文件路径(可以省略),解…...
Coredump-N:sprintf写越界
最近遇到一个sanitizer检查出来的问题; unsigned long abc = 0xffffffffffffffff; char link[8] = {0}; sprintf(link, "%u", abc);这段代码存在潜在问题。 数据类型不匹配: abc 是一个 unsigned long 类型...
自学Java-面向对象高级(final、单例类、枚举类、抽象类、接口)
自学Java-面向对象高级(final、单例类、枚举类、抽象类、接口) 一、final关键字1、认识final关键字2、final修饰变量的注意3、常量 二、单例类(设计模式)1、设计模式的概念2、单例设计模式3、单例类有很多形式4、懒汉式单例类5、小…...
[LeetCode力扣hot100]-二叉树相关手撕题
简单 94.中序遍历 就说左子树-根-右子树顺序,之前也有二叉树相关的文章,基本上递归为主,这里用栈等方式实现下。 用到:栈 注意上面给出节点的基本结构,如左右,val指等 /*** Definition for a binary t…...
