题面
思路
按
照
年
龄
从
小
到
大
排
序
,
如
果
年
龄
相
同
,
分
数
从
小
到
大
排
序
按照年龄从小到大排序,如果年龄相同,分数从小到大排序
按照年龄从小到大排序,如果年龄相同,分数从小到大排序
设
d
p
[
i
]
表
示
前
i
个
人
中
选
择
第
i
个
的
最
优
值
设dp[i]表示前i个人中选择第i个的最优值
设dp[i]表示前i个人中选择第i个的最优值
如
果
第
j
个
人
分
数
值
小
于
等
于
第
i
个
人
,
那
么
就
可
以
利
用
d
p
[
j
]
更
新
如果第j个人分数值小于等于第i个人,那么就可以利用dp[j]更新
如果第j个人分数值小于等于第i个人,那么就可以利用dp[j]更新
即
d
p
[
j
]
+
第
i
个
人
的
分
数
即dp[j]+第i个人的分数
即dp[j]+第i个人的分数
const int maxn = 1e3 + 10;
typedef long long ll;
class Solution {
public:
struct node{
int x, y;
bool operator < (const node& b)const{
if(y == b.y) return x < b.x;
return y < b.y;
}
}a[maxn];
ll dp[maxn];
int bestTeamScore(vector<int>& scores, vector<int>& ages) {
int n = scores.size();
for(int i = 1; i <= n; i++){
a[i].x = scores[i - 1];
a[i].y = ages[i - 1];
}
sort(a + 1, a + n + 1);
ll ans = 0;
for(int i = 1; i <= n; i++){
dp[i] = a[i].x;
for(int j = 1; j < i; j++){
if(a[j].x <= a[i].x){
dp[i] = max(dp[i], dp[j] + a[i].x);
}
}
ans = max(ans, dp[i]);
}
return ans;
}
};