[BCSP-X2024.小高3] 学习计划
题目描述
暑假共有 n 天,第 i 天的精力指数为 a[i],你想要利用假期依次(按 1,2,...,m 顺序)复习 m 门功课,第 i 门功课的重要程度为 b[i],且每门的复习时段必须连
续,并且不能有某天不干事。
假设第 i 门功课的复习时段为第 l∼r 天,那么第 i 门功课的收益为 b[i]×(a[l]+a[l+1]+...+a[r]),你的总收益为 m 门功课收益的总和。
请你制订一个复习计划,使得总收益最大。
形式化地,给定序列 a[1∼n],b[1∼m],你需要把 1,2,...,n 这个序列分成首尾相
连且非空的 m 段,假设每段的 a 之和为 s[1∼m],最大化 ∑i+1mb[i]×s[i] 的值。
例如 a=[−3,6,−1,−8,7,−6],b=[−3,2],最优策略是第 1∼4 天复习第 1 门功课,收益为 −3×(−3+6−1−8)=18;第 5∼6 天复习第 2 门功课,收益为 2×(7−6)=2;总收益为 18+2=20。
例如 a=[6,3,5,10,5],b=[−8,−5,−5],最优策略是分成 [1],[2,3,4],[5] 三段,总收益为 −8×6−5×(3+5+10)−5×5=−163。
输入格式
第一行为 1 个整数 T,代表有 T 组数据。
每组数据第一行 2 个整数 n,m,第二行 n 个整数 a[1∼n],第三行 m 个整数 b[1∼m]。
输出格式
输出 T 行,每行 1 个整数代表答案。
样例 #1
样例输入 #1
5
6 2
-3 6 -1 -8 7 -6
-3 2
5 4
-9 -6 -6 -7 -8
-5 7 -9 -3
7 7
7 2 3 0 -2 4 2
-9 -2 -5 0 -7 9 -1
5 3
10 4 6 7 4
-1 -9 2
5 3
6 3 5 10 5
-8 -5 -5
样例输出 #1
20
144
-34
-12
-163
提示
对于所有数据,满足 1≤T≤20,1≤m≤n≤2000,−10^3≤a[i],b[i]≤10^3 。
对于测试点 1∼7:n≤10
对于测试点 8∼12:n≤500
对于测试点 13∼16:所有 a[i],b[i] 均为正整数
对于测试点 17∼20:n≤2000
#include <bits/stdc++.h>
using namespace std;int a[2010],b[2010];//-1e3~1e3 -1e3~1e3
int dp[2010];//-2e9~2e9
int main()
{int t;//1~2e1cin>>t;while(t--){memset(dp,0x80,sizeof(dp));int n,m;//1~2e3cin>>n>>m;for(int i=1;i<=n;i++)cin>>a[i];for(int i=1;i<=m;i++)cin>>b[i];dp[1]=a[1]*b[1];for(int i=2;i<=n;i++)for(int j=m;j>=1;j--)dp[j]=a[i]*b[j]+max(dp[j-1],dp[j]);cout<<dp[m]<<endl;}return 0;
}
背景
这道题是我考BCSP-X的T3,当时直接爆零……
主题思路
首先,最重要的一点——你得意识到这是个DP。在这之后,要思考几件事。
1.不出意外的话,这是个二维dp,毕竟是T3。
2.直觉告诉我们,dp[i][j]里存的是到i为止的最大收益。那第一、二维代表什么?可以找题目中的时间,状态,以及其他变量。有时间(天),那第一维就是天。很显然,第二维最合适的的是科目,因为它与时间没有什么关联,而且是决定答案的关键因素之一。
3.dp[i][j]是由什么推导而来的?即第1~i天如果选择第j门功课,最大收益与什么有关联?走到这一步时,首先要加上今天本身的收益——a[i]*b[j],紧接着要加第1~i-1天的最大收益,这时你有两个选择(要选最大值)。如果你仍延续了昨天的选择,如继续学习语文,那么要加上dp[i-1][j],时间变为昨天,科目不变;如果你换了一科,如改为学习数学,那么要加上dp[i-1][j-1],时间变为昨天,科目变为上一个科目。注意,题目中说“你想要利用假期依次(按 1,2,...,m 顺序)复习 m 门功课”,那么你就只能是紧挨着你的上一个功课变来的。
接下来就没什么了,由3.我们可以得到最最最重要的状态转移方程式:dp[i][j]=a[i]*b[j]+max(dp[i-1][j-1],dp[i-1][j]);,就……做完了。
细节重点
1.由于是多组数据,肯定少不了memset。a、b数组会覆盖不用管,但是dp要给赋值成极小值。这是因为在max(dp[j-1],dp[j])处可能会取到尚未赋值的dp区域,如果赋值的部分是负数,理论上应取这个负数,但如果置成0就会取0,所以最开始要赋值为极小值(0x80808080),让他“被迫”选这个复数。
2.写完之后,你会发现这道题像极了01背包,相应的,你也可以做同样的空间压缩。由于每次只与上一行有推导关系,可以将第一维删去。需要注意的是,如果你想访问上一轮的数据,在递推的第二层循环处你需要改成逆序。
相关文章:
[BCSP-X2024.小高3] 学习计划
题目描述 暑假共有 n 天,第 i 天的精力指数为 a[i],你想要利用假期依次(按 1,2,...,m 顺序)复习 m 门功课,第 i 门功课的重要程度为 b[i],且每门的复习时段必须连 续,并且不能有某天不干事。 …...
Android Debug Bridge(ADB)完全指南
文章目录 前言一、什么是ADB?二、ADB的工作原理ADB由三个部分组成: 三、如何安装ADBWindows系统:macOS和Linux系统: 四、ADB常用指令大全设备相关操作1. 查看连接的设备:2. 重启设备:3. 进入Bootloader模式…...
再次重逢,愿遍地繁花
再次重逢,愿遍地繁花 我并不是一个对最终幻想7很热衷的粉丝,也并没有像那些评论区的大佬,能够轻易地说出整部世界的全貌。说到底,我只是一个看完了《最终幻想7:重制版》和《最终幻想7:重生》的爱好者罢了。…...
数据结构和算法基础(一)
文章目录 链表反转链表合并删除链表倒数第 n 个结点找链表的中间结点链表中环的检测排序算法递归 趁空闲时间刷一遍极客时间上王争的《数据结构与算法之美》课程,个人觉得写的很好,每章节由浅入深且从基础到引入设计类问题,如果写过很多代码想…...
【超长好文】网络安全从业者面试指南
文章为笔者偶然看到的github项目《网络安全面试指南》,作者FeeiCN,读完内容深感作者的用心,尽管一些观点因为时间原因与当下行情存在差异,但仍旧值得大家参考,希望能给大家在这行业寒冬带来一些启发,愿正在…...
基于大数据的高校新生数据可视化分析系统
作者:计算机学姐 开发技术:SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等,“文末源码”。 专栏推荐:前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏:…...
【cache】浅析四种常用的缓存淘汰算法 FIFO/LRU/LFU/W-TinyLFU
本文浅析淘汰策略与工作中结合使用、选取,并非针对算法本身如何实现的 文章目录 FIFOLFULRUW-TinyLFU实践与优化监控与调整 FIFO first input first output , 先进先出,即最早存入的元素最先取出, 典型数据结构代表:…...
STM32的DMA技术介绍
DMA(Direct Memory Access,直接内存访问) 是一种允许外设直接与系统内存进行数据传输,而无需经过CPU的技术。在STM32微控制器中,DMA技术极大地提高了数据传输效率,降低了CPU的负担,从而提升系统…...
C++11 多线程编程-小白零基础到手撕线程池
提示:文章 文章目录 前言一、背景二、 2.1 2.2 总结 前言 前期疑问: 本文目标: 一、背景 来源于b站视频 C11 多线程编程-小白零基础到手撕线程池 学习来源:https://www.bilibili.com/video/BV1d841117SH/?p2&spm_id_f…...
智源研究院与百度达成战略合作 共建AI产研协同生态
2024年9月24日,北京智源人工智能研究院(简称“智源研究院”)与北京百度网讯科技有限公司(简称“百度”)正式签署战略合作协议,双方将充分发挥互补优势,在大模型等领域展开深度合作,共…...
Flask-SQLAlchemy:在Flask应用中优雅地操作数据库
在Python的Web开发领域,Flask是一个备受欢迎的轻量级Web框架,它以简洁、灵活而著称。而当我们需要在Flask应用中与数据库进行交互时,Flask-SQLAlchemy就成为了一个强大而便捷的工具。它将Flask的简洁性与SQLAlchemy的强大数据库抽象能力完美结…...
智能巡检机器人 数据库
智能巡检机器人AI智能识别。无需人工。只需后台监控结果即可!...
Spring AOP异步操作实现
在Spring框架中,AOP(面向切面编程)提供了一种非常灵活的方式来增强应用程序的功能。异步操作是现代应用程序中常见的需求,尤其是在处理耗时任务时,它可以帮助我们提高应用程序的响应性和吞吐量。Spring提供了一种简单的…...
【2006.07】UMLS工具——MetaMap原理深度解析
文献:《MetaMap: Mapping Text to the UMLS Metathesaurus》2006 年 7 月 14 日 https://lhncbc.nlm.nih.gov/ii/information/Papers/metamap06.pdf MetaMap:将文本映射到 UMLS 元数据库 总结 解决的问题 自动概念映射问题:解决如何将文本…...
ros2 colcon build 构建后,install中的local_setup.bash 和setup.bash有什么区别
功能概述 在 ROS2 中,colcon build是用于构建软件包的工具。构建完成后会生成install文件夹,其中的setup.bash和local_setup.bash文件都与环境设置相关,但存在一些区别。setup.bash 作用范围 setup.bash文件用于设置整个工作空间的环境变量。…...
Thymeleaf基础语法
Thymeleaf 是一种用于 Web 和非 Web 环境的现代服务器端 Java 模板引擎。它能够处理 HTML、XML、JavaScript、CSS 甚至纯文本。以下是 Thymeleaf 的一些基础语法: 1. 变量表达式 <!-- 显示变量的值 --> <p th:text"${name}">Default Name&l…...
spring cloud alibaba学习路线
以下是一条学习Spring Cloud Alibaba的路线: 一、基础前置知识 1. Java基础 熟练掌握Java语言特性,包括面向对象编程、集合框架、多线程等知识。 2. Spring和Spring Boot基础深入理解Spring框架,如依赖注入(DI)、控…...
基于 Seq2Seq 的中英文翻译项目(pytorch)
项目简介 本项目旨在使用 PyTorch 构建一个基于 Seq2Seq(编码器-解码器架构)的中英文翻译模型。我们将使用双语句子对的数据进行训练,最终实现一个能够将英文句子翻译为中文的模型。项目的主要步骤包括: 数据预处理:从数据集中提取英文和中文句子,并进行初步清洗和保存。…...
部标主动安全(ADAS+DMS)对接说明
1.前言 上一篇介绍了部标(JT/T1078)流媒体对接说明,这里说一下如何对接主动安全附件服务器。 流媒体的对接主要牵扯到4个方面: (1)平台端:业务端系统,包含前端呈现界面。 &#x…...
C++ STL(1)迭代器
文章目录 一、迭代器详解1、迭代器的定义与功能2、迭代器类型3、示例4、迭代器失效4.1、vector 迭代器失效分析4.2、list 迭代器失效分析4.3、set 与 map 迭代器失效分析 5、总结 前言: 在C标准模板库(STL)中,迭代器是一个核心概念…...
基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...
8k长序列建模,蛋白质语言模型Prot42仅利用目标蛋白序列即可生成高亲和力结合剂
蛋白质结合剂(如抗体、抑制肽)在疾病诊断、成像分析及靶向药物递送等关键场景中发挥着不可替代的作用。传统上,高特异性蛋白质结合剂的开发高度依赖噬菌体展示、定向进化等实验技术,但这类方法普遍面临资源消耗巨大、研发周期冗长…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)
目录 1.TCP的连接管理机制(1)三次握手①握手过程②对握手过程的理解 (2)四次挥手(3)握手和挥手的触发(4)状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
Java线上CPU飙高问题排查全指南
一、引言 在Java应用的线上运行环境中,CPU飙高是一个常见且棘手的性能问题。当系统出现CPU飙高时,通常会导致应用响应缓慢,甚至服务不可用,严重影响用户体验和业务运行。因此,掌握一套科学有效的CPU飙高问题排查方法&…...
从“安全密码”到测试体系:Gitee Test 赋能关键领域软件质量保障
关键领域软件测试的"安全密码":Gitee Test如何破解行业痛点 在数字化浪潮席卷全球的今天,软件系统已成为国家关键领域的"神经中枢"。从国防军工到能源电力,从金融交易到交通管控,这些关乎国计民生的关键领域…...
提升移动端网页调试效率:WebDebugX 与常见工具组合实践
在日常移动端开发中,网页调试始终是一个高频但又极具挑战的环节。尤其在面对 iOS 与 Android 的混合技术栈、各种设备差异化行为时,开发者迫切需要一套高效、可靠且跨平台的调试方案。过去,我们或多或少使用过 Chrome DevTools、Remote Debug…...
前端中slice和splic的区别
1. slice slice 用于从数组中提取一部分元素,返回一个新的数组。 特点: 不修改原数组:slice 不会改变原数组,而是返回一个新的数组。提取数组的部分:slice 会根据指定的开始索引和结束索引提取数组的一部分。不包含…...
