【C++动态规划 离散化】1626. 无矛盾的最佳球队|2027

本文涉及知识点

C++动态规划 离散化

LeetCode1626. 无矛盾的最佳球队

假设你是球队的经理。对于即将到来的锦标赛,你想组合一支总体得分最高的球队。球队的得分是球队中所有球员的分数 总和 。
然而,球队中的矛盾会限制球员的发挥,所以必须选出一支 没有矛盾 的球队。如果一名年龄较小球员的分数 严格大于 一名年龄较大的球员,则存在矛盾。同龄球员之间不会发生矛盾。
给你两个列表 scores 和 ages,其中每组 scores[i] 和 ages[i] 表示第 i 名球员的分数和年龄。请你返回 所有可能的无矛盾球队中得分最高那支的分数 。
示例 1:
输入:scores = [1,3,5,10,15], ages = [1,2,3,4,5]
输出:34
解释:你可以选中所有球员。
示例 2:
输入:scores = [4,5,6,5], ages = [2,1,2,1]
输出:16
解释:最佳的选择是后 3 名球员。注意,你可以选中多个同龄球员。
示例 3:
输入:scores = [1,2,3,5], ages = [8,9,10,1]
输出:6
解释:最佳的选择是前 3 名球员。
提示:
1 <= scores.length, ages.length <= 1000
scores.length == ages.length
1 <= scores[i] <= 106
1 <= ages[i] <= 1000

动态规划+离散化

将分数离散化,并用nums记录原始分数。分数最小的位1,次小的为2 ⋯ \cdots
将年龄离散化,方便处理比当前队员年龄小的队员。

动态规划的状态表示

dp[i][j] 表示 球员的年龄 <= i,离散化后的能力 <=j 组成的无矛盾球队的最大得分。空间复杂度:O(nm) m是离散后的最大年龄

动态规划的填表顺序

将任意最优解,按如下方式排序后,仍然是最优解。
一,年龄小的在前,年龄大的在后。
二,年龄相等,能力小的在前,能力大的在后。
三,年龄能力都相等,按scores中的顺序。
indexs的球员的下标按上述方式排序,按k:indexs顺序处理各球员。

动态规划的转移方程

i = ages[k] j = scores[k]
d p [ i ] [ j ] = M a x { d p [ i ] [ j ] + 当前球员的能力 前一个球员年龄相同 d p [ i − 1 ] [ j ] + 当前球员的能力 前一个球员年龄不同 dp[i][j]=Max\begin{cases} dp[i][j]+当前球员的能力 &&前一个球员年龄相同 \\ dp[i-1][j]+当前球员的能力 && 前一个球员年龄不同\\ \end{cases} dp[i][j]=Max{dp[i][j]+当前球员的能力dp[i1][j]+当前球员的能力前一个球员年龄相同前一个球员年龄不同
每次更新dp后,都要:

for (j =1 ; j <= N; j++) {dp[i][j] = max(dp[i][j], dp[i][j - 1]);dp[i][j] = max(dp[i][j], dp[i-1][j ]);}

时间复杂度:O(nm)

动态规划的初始值

全为0

动态规划的返回值

dp的最大值。

代码

核心代码

class Solution {public:int bestTeamScore(vector<int>& scores, vector<int>& ages) {const int N = scores.size();{auto tmp = ages;tmp.emplace_back(0);CDiscretize dis(tmp);for (auto& i : ages) {i = dis[i];}}const int M = *max_element(ages.begin(), ages.end());auto tmp = scores;tmp.emplace_back(0);CDiscretize dis(tmp);for (auto& i : scores) {i = dis[i];}vector<int> index(N);iota(index.begin(), index.end(), 0);sort(index.begin(), index.end(), [&](int i1, int i2) {return (ages[i1] < ages[i2]) || ((ages[i1] == ages[i2]) && (scores[i1] < scores[i2]));	});vector<vector<int>> dp(M + 1, vector<int>(N + 1));int ans = 0;for (int k : index) {const int i = ages[k];int j = scores[k];dp[i][j] = max(dp[i - 1][j], dp[i][j]) + dis.m_nums[j];ans = max(ans, dp[i][j]);for (j =1 ; j <= N; j++) {dp[i][j] = max(dp[i][j], dp[i][j - 1]);dp[i][j] = max(dp[i][j], dp[i-1][j ]);}}return ans;}};

单元测试

vector<int> scores, ages;TEST_METHOD(TestMethod1){scores = { 3,2,4 }, ages = { 1,2,3 };auto res = Solution().bestTeamScore(scores, ages);AssertEx(7, res);}TEST_METHOD(TestMethod11){scores = { 1,3,5,10,15 }, ages = { 1,2,3,4,5 };auto res = Solution().bestTeamScore(scores, ages);AssertEx(34, res);}TEST_METHOD(TestMethod12){scores = { 4,5,6,5 }, ages = { 2,1,2,1 };auto res = Solution().bestTeamScore(scores, ages);AssertEx(16, res);}TEST_METHOD(TestMethod13){scores = { 1,2,3,5 }, ages = { 8,9,10,1 };auto res = Solution().bestTeamScore(scores, ages);AssertEx(6, res);}TEST_METHOD(TestMethod14){scores = { 1,1,1 }, ages = { 3,2,1 };auto res = Solution().bestTeamScore(scores, ages);AssertEx(3, res);}TEST_METHOD(TestMethod15){scores = { 1,1,1 }, ages = { 1,3,5};auto res = Solution().bestTeamScore(scores, ages);AssertEx(3, res);}TEST_METHOD(TestMethod16){scores = { 1,1,1,1,1,1,1,1,1,1 }, ages = { 811,364,124,873,790,656,581,446,885,134 };auto res = Solution().bestTeamScore(scores, ages);AssertEx(10, res);}TEST_METHOD(TestMethod17){scores = { 6,5,1,7,6,5,5,4,10,4 }, ages = { 3,2,5,3,2,1,4,4,5,1 };auto res = Solution().bestTeamScore(scores, ages);AssertEx(43, res);}

优化

i1 < i2 ,k1 = index[i1] ,k2 = index[i2]。
某方案以球员k1结尾。
如果k1的能力小于等于k2,则此方案加上i2一定不会冲突。
如果 k1的能了大于k2,由于已经按本题解排序,所以k1的年龄一定小于k2:故一定冲突。
故只需枚举能力小于等于当前能力的球员。空间复杂度:O(n)
可以用线段树。时间复杂度:O(nlogn)
直接枚举时间复杂度:O(nn)

代码

class CDiscretize //离散化
{
public:CDiscretize(vector<int> nums){sort(nums.begin(), nums.end());nums.erase(std::unique(nums.begin(), nums.end()), nums.end());m_nums = nums;for (int i = 0; i < nums.size(); i++){m_mValueToIndex[nums[i]] = i;}}int operator[](const int value)const{auto it = m_mValueToIndex.find(value);if (m_mValueToIndex.end() == it){return -1;}return it->second;}int size()const{return m_mValueToIndex.size();}vector<int> m_nums;
protected:	unordered_map<int, int> m_mValueToIndex;
};class Solution {public:int bestTeamScore(vector<int>& scores, vector<int>& ages) {const int N = scores.size();			CDiscretize dis(scores);for (auto& i : scores) {i = dis[i];}vector<int> index(N);iota(index.begin(), index.end(), 0);sort(index.begin(), index.end(), [&](int i1, int i2) {return (ages[i1] < ages[i2]) || ((ages[i1] == ages[i2]) && (scores[i1] < scores[i2]));	});vector<int> dp(N + 1);int ans = 0;for (int k : index) {const int i = ages[k];int j = scores[k];const int iMax = *max_element(dp.begin() , dp.begin() + j + 1);dp[j] = max(dp[j], iMax + dis.m_nums[j]);ans = max(ans, dp[j]);}return ans;}};

扩展阅读

我想对大家说的话
工作中遇到的问题,可以按类别查阅鄙人的算法文章,请点击《算法与数据汇总》。
学习算法:按章节学习《喜缺全书算法册》,大量的题目和测试用例,打包下载。重视操作
有效学习:明确的目标 及时的反馈 拉伸区(难度合适) 专注
闻缺陷则喜(喜缺)是一个美好的愿望,早发现问题,早修改问题,给老板节约钱。
子墨子言之:事无终始,无务多业。也就是我们常说的专业的人做专业的事。
如果程序是一条龙,那算法就是他的是睛
失败+反思=成功 成功+反思=成功

视频课程

先学简单的课程,请移步CSDN学院,听白银讲师(也就是鄙人)的讲解。
https://edu.csdn.net/course/detail/38771
如何你想快速形成战斗了,为老板分忧,请学习C#入职培训、C++入职培训等课程
https://edu.csdn.net/lecturer/6176

测试环境

操作系统:win7 开发环境: VS2019 C++17
或者 操作系统:win10 开发环境: VS2022 C++17
如无特殊说明,本算法用**C++**实现。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【安全测试】测开方向学习遇到的问题记录

【问题一】springboot如何访问静态资源文件 springboot启动根路径位置 F:\untitled05\demo4\src\main\resources\static 例如图片位置存放在F:\untitled05\demo4\src\main\resources\static即可 配置文件配置 spring.web.resources.static-locationsfile:/F:/untitled05/de…

Github 2025-01-25Rust开源项目日报Top10

根据Github Trendings的统计,今日(2025-01-25统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Python项目1Vue项目1JavaScript项目1Deno: 现代JavaScript和TypeScript运行时 创建周期:2118 天开发语言:Rust, JavaScript协议类型…

详细解释java当中的所有知识点(前言及数据类型及变量)(第一部分)

会将java当中的所有的知识点以及相关的题目进行分享&#xff0c;这是其中的第一部分&#xff0c;用红色字体标注出重点&#xff0c;以及加粗的方式进行提醒 目录 一、Java语言概述 1.Java语言简介 2.语言优势 二、main方法 1.Java程序结构组成 2.运行Java程序 3.注释 4.…

HarmonyOS应用开发快速入门

本节内容将帮助开发者学习如何构建一个全新的HarmonyOS应用&#xff0c;学习使用DevEco Studio创建新项目、使用预览器预览页面、了解基础组件如Image、Text等。 文章目录 一、介绍二、创建一个新项目三、页面结构总览四、自定义文本视图五、创建Image组件 一、介绍 根据本教程…

ICSE‘25 LLM Assistance for Memory Safety

不知道从什么时候开始&#xff0c;各大技术社区&#xff0c;技术群聊流行着 “用Rust重写!” &#xff0c;放一张图(笑死… 这不, 随着大模型技术的流行&#xff0c;大家都在探索如何让大模型自动完成仓库级别(全程序)的代码重构&#xff0c;代码变换&#xff08;Refactor&…

Java实现.env文件读取敏感数据

文章目录 1.common-env-starter模块1.目录结构2.DotenvEnvironmentPostProcessor.java 在${xxx}解析之前执行&#xff0c;提前读取配置3.EnvProperties.java 这里的path只是为了代码提示4.EnvAutoConfiguration.java Env模块自动配置类5.spring.factories 自动配置和注册Enviro…

基于Python的人工智能患者风险评估预测模型构建与应用研究(下)

3.3 模型选择与训练 3.3.1 常见预测模型介绍 在构建患者风险评估模型时,选择合适的预测模型至关重要。不同的模型具有各自的优缺点和适用场景,需要根据医疗数据的特点、风险评估的目标以及计算资源等因素进行综合考虑。以下详细介绍几种常见的预测模型。 逻辑回归(Logisti…

零基础Vue入门4——Vue3基础核心

本节重点&#xff1a; vue3最佳实践 ref reactive computed watch、watchEffect 讲解重点之后下面会带大家开发一个页面&#xff08;表单表格&#xff09;&#xff0c;之后会有一个TodoList的小练习&#xff0c;文末附有小练习的代码参考。跟着练习一定带你可以上手开发vu…

一文掌握ADB的安装及使用

文章目录 一、什么是ADB&#xff1f;二、 安装ADB2.1 下载ADB2.2 配置环境变量 三、连接Android设备四、 常用ADB命令五、ADB高级功能5.1 屏幕截图和录制5.2 模拟按键输入5.3 文件管理5.4 系统设置管理5.5 系统操作指令5.6 日志操作指令5.7 APK操作指令5.8 设备重启和恢复 六、…

使用Edu邮箱申请一年免费的.me域名

所需材料&#xff1a;公立Edu教育邮箱一枚&#xff08;P.S&#xff1a;该服务不支持所有的Edu教育邮箱&#xff0c;仅支持比较知名的院校&#xff09; 说到域名&#xff0c;.me这个后缀可谓是个性十足&#xff0c;适合个人网站、博客等。.me是黑山的国家顶级域名&#xff08;c…

7.抽象工厂(Abstract Factory)

抽象工厂与工厂方法极其类似&#xff0c;都是绕开new的&#xff0c;但是有些许不同。 动机 在软件系统中&#xff0c;经常面临着“一系列相互依赖的对象”的创建工作&#xff1b;同时&#xff0c;由于需求的变化&#xff0c;往往存在更多系列对象的创建工作。 假设案例 假设…

Visual Studio使用GitHub Copilot提高.NET开发工作效率

GitHub Copilot介绍 GitHub Copilot 是一款 AI 编码助手&#xff0c;可帮助你更快、更省力地编写代码&#xff0c;从而将更多精力集中在问题解决和协作上。 GitHub Copilot Free包含哪些功能&#xff1f; 每月 2000 代码补全&#xff0c;帮助开发者快速完成代码编写。 每月 …

[JavaWeb]搜索表单区域

一.注意事项 设置外边距:margin:(参数可省去部分)上 下 左 右 二.源代码 <!DOCTYPE html> <html lang"zh-CN"> <head> <meta charset"UTF-8"> <title>Tlias智能学习辅助系统</title> <style> /* 导航栏样…

NLP自然语言处理通识

目录 ELMO 一、ELMo的核心设计理念 1. 静态词向量的局限性 2. 动态上下文嵌入的核心思想 3. 层次化特征提取 二、ELMo的模型结构与技术逻辑 1. 双向语言模型&#xff08;BiLM&#xff09; 2. 多层LSTM的层次化表示 三、ELMo的运行过程 1. 预训练阶段 2. 下游任务微调 四、ELMo的…

Eureka 服务注册和服务发现的使用

1. 父子工程的搭建 首先创建一个 Maven 项目&#xff0c;删除 src &#xff0c;只保留 pom.xml 然后来进行 pom.xml 的相关配置 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xs…

OpenCV:二值化与自适应阈值

目录 简述 1. 什么是二值化 2. 二值化接口 2.1 参数说明​​​​​ 2.2 示例代码 2.3 运行结果 3. 自适应阈值 3.1 参数说明 3.2 示例代码 3.3 运行结果 4. 总结 4.1 二值化 4.2 自适应阈值 相关阅读 OpenCV&#xff1a;图像的腐蚀与膨胀-CSDN博客 简述 图像二值…

Java面试题2025-设计模式

1.说一下开发中需要遵守的设计原则&#xff1f; 设计模式中主要有六大设计原则&#xff0c;简称为SOLID &#xff0c;是由于各个原则的首字母简称合并的来(两个L算一个,solid 稳定的)&#xff0c;六大设计原则分别如下&#xff1a; 1、单一职责原则 单一职责原则的定义描述非…

Win11下帝国时代2无法启动解决方法

鼠标右键点图标&#xff0c;选择属性 点开始&#xff0c;输入启用和关闭

JAVA实战开源项目:在线文档管理系统(Vue+SpringBoot) 附源码

本文项目编号 T 038 &#xff0c;文末自助获取源码 \color{red}{T038&#xff0c;文末自助获取源码} T038&#xff0c;文末自助获取源码 目录 一、系统介绍二、演示录屏三、启动教程四、功能截图五、文案资料5.1 选题背景5.2 国内外研究现状5.3 可行性分析 六、核心代码6.1 查…

Python设计模式 - 组合模式

定义 组合模式&#xff08;Composite Pattern&#xff09; 是一种结构型设计模式&#xff0c;主要意图是将对象组织成树形结构以表示"部分-整体"的层次结构。这种模式能够使客户端统一对待单个对象和组合对象&#xff0c;从而简化了客户端代码。 组合模式有透明组合…