1. 程式人生 > 實用技巧 >b_lc_無矛盾的最佳球隊(排序+LIS)

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;
    }
};