力扣(LeetCode)1626. 无矛盾的最佳球队(C++)
创始人
2025-06-01 08:14:18
0

排序 + 动态规划

两个性质: ①得分最高 ② 年龄大的,分数要高。
这提示我们按照分数,或者年龄,对列表排序。先固定一个性质,才考虑另外的性质。

按照分数和年龄排序都可以。这里按照年龄,从大到小排序。年龄大的,自然在前;年龄相同,分数大的在前。在排序后的数组里,找到最大下降子序列和,满足一个条件 —— 越靠前,分数越大。即为所求。

状态定义: f[i]f[i]f[i] 表示所有以 p[i]p[i]p[i] 结尾的最大下降子序列和。
状态转移方程: f[i]=max(f[j])+p[i],j∈[0,i)f[i] = max(f[j]) +p[i], \ j \isin [0,i)f[i]=max(f[j])+p[i], j∈[0,i)

最后,答案序列不一定以数组末尾结尾,可能在任何位置结尾,需要维护最大的 f[i]f[i]f[i] ,即为答案。

class Solution {
public:static bool cmp(pair x, pair y) {return (x > y);}int bestTeamScore(vector& scores, vector& ages) {int n = scores.size();vector> p(n);for (int i = 0; i < n; i ++) p[i] = {ages[i], scores[i]};sort(p.begin(), p.end(), cmp);vector f(n);int ans = 0;for (int i = 0; i < n ; i ++) {for (int j = i - 1; j >= 0; j --) {if (p[j].second >= p[i].second) {f[i] = max(f[i], f[j]);}}f[i] += p[i].second;ans = max (ans, f[i]);}return ans;}
};
  1. 时间复杂度 : O(n2)O(n ^ 2)O(n2) , nnn 是球员的数目,一共 nnn 状态,平均每个状态转移 nnn 次,时间复杂度 O(n2)O(n^2)O(n2)。
  2. 空间复杂度 : O(n)O(n)O(n) ,状态数组和分数-年龄数组的空间复杂度 O(n)O(n)O(n) 。

AC

AC

致语

  • 理解思路很重要
  • 读者有问题请留言,清墨看到就会回复的。

相关内容

热门资讯

监控摄像头接入GB28181平... 流程简介将监控摄像头的视频在网站和APP中直播,要解决的几个问题是:1&...
Windows10添加群晖磁盘... 在使用群晖NAS时,我们需要通过本地映射的方式把NAS映射成本地的一块磁盘使用。 通过...
protocol buffer... 目录 目录 什么是protocol buffer 1.protobuf 1.1安装  1.2使用...
educoder数据结构与算法...                                                   ...
MySQL下载和安装(Wind... 前言:刚换了一台电脑,里面所有东西都需要重新配置,习惯了所...
MFC文件操作  MFC提供了一个文件操作的基类CFile,这个类提供了一个没有缓存的二进制格式的磁盘...
在Word、WPS中插入AxM... 引言 我最近需要写一些文章,在排版时发现AxMath插入的公式竟然会导致行间距异常&#...
有效的括号 一、题目 给定一个只包括 '(',')','{','}'...
Fluent中创建监测点 1 概述某些仿真问题,需要创建监测点,用于获取空间定点的数据࿰...
【Ctfer训练计划】——(三... 作者名:Demo不是emo  主页面链接:主页传送门 创作初心ÿ...