b_lc_無矛盾的最佳球隊(排序+LIS)
阿新 • • 發佈:2020-10-20
選出一支 沒有矛盾 的球隊。如果一名年齡較小球員的分數 嚴格大於 一名年齡較大的球員,則存在矛盾。同齡球員之間不會發生矛盾。
給你兩個列表 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; } };