b_lc_无矛盾的最佳球队(排序+LIS)

选出一支 没有矛盾 的球队。如果一名年龄较小球员的分数 严格大于 一名年龄较大的球员,则存在矛盾。同龄球员之间不会发生矛盾。
给你两个列表 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;
    }
};
原文地址:https://www.cnblogs.com/wdt1/p/13836539.html