选出一支 没有矛盾 的球队。如果一名年龄较小球员的分数 严格大于 一名年龄较大的球员,则存在矛盾。同龄球员之间不会发生矛盾。
给你两个列表 scores 和 ages,其中每组 scores[i] 和 ages[i] 表示第 i 名球员的分数和年龄。
请你返回 所有可能的无矛盾球队中得分最高那支的分数
思路
LIS变形,没注意到同龄球员无矛盾的字眼,错了一次;
f[i]表示0...i中LIS的长度,写下的第一版代码
const int N=1005;
typedef long long ll;
class Solution {
public:
struct node {
ll s,a;
bool operator<(node& b) {
return a!=b.a ? a<b.a : b.s<s;
}
} A[N];
int bestTeamScore(vector<int>& ss, vector<int>& as) {
ll n=ss.size(), ans=0, f[n]; memset(f,0,sizeof f);
for (int i=0; i<n; i++) A[i].s=ss[i], A[i].a=as[i];
sort(A,A+n);
for (int i=0; i<n; i++) f[i]=A[i].s;
for (int i=1; i<n; i++)
for (int j=0; j<i; j++) if (A[j].a==A[i].a || A[j].s<=A[j].s) {
f[i]=max(f[i], f[j]+A[j].s);
}
for (ll v : f) ans=max(ans, v);
return ans;
}
};
还是错了,当age相同时,应按照分数升序排,为了遇到下一个age更大时的容错率更大
const int N=1005;
typedef long long ll;
class Solution {
public:
struct node {
ll s,a;
bool operator<(node& b) {
return a!=b.a ? a<b.a : s<b.s;
}
};
int bestTeamScore(vector<int>& scores, vector<int>& ages) {
ll n=scores.size(), ans=0, f[n];
node A[n];
for (int i=0; i<n; i++) A[i].s=scores[i], A[i].a=ages[i];
sort(A,A+n);
for (int i=0; i<n; i++) f[i]=A[i].s;
for (int i=1; i<n; i++)
for (int j=0; j<i; j++) if (A[j].a==A[i].a || A[j].s<=A[i].s) {
f[i]=max(f[i], f[j]+A[i].s);
}
for (int i=0; i<n; i++) ans=max(ans, f[i]);
return ans;
}
};