LeetCode 1626. 無矛盾的最佳球隊---【動態規劃】最長上升子序列變換版-->最大上升子序列和
- 無矛盾的最佳球隊
假設你是球隊的經理。對於即將到來的錦標賽,你想組合一支總體得分最高的球隊。球隊的得分是球隊中所有球員的分數 總和 。
然而,球隊中的矛盾會限制球員的發揮,所以必須選出一支 沒有矛盾 的球隊。如果一名年齡較小球員的分數 嚴格大於 一名年齡較大的球員,則存在矛盾。同齡球員之間不會發生矛盾。
給你兩個列表 scores 和 ages,其中每組 scores[i] 和 ages[i] 表示第 i 名球員的分數和年齡。請你返回 所有可能的無矛盾球隊中得分最高那支的分數 。
示例 1:
輸入:scores = [1,3,5,10,15], ages = [1,2,3,4,5]
輸出:34
解釋:你可以選中所有球員。
示例 2:
輸入:scores = [4,5,6,5], ages = [2,1,2,1]
輸出:16
解釋:最佳的選擇是後 3 名球員。注意,你可以選中多個同齡球員。
示例 3:
輸入:scores = [1,2,3,5], ages = [8,9,10,1]
輸出:6
解釋:最佳的選擇是前 3 名球員。
提示:
1 <= scores.length, ages.length <= 1000
scores.length == ages.length
1 <= scores[i] <= 106
1 <= ages[i] <= 1000
題解:
一開始看到這個題目差點往圖的方向深想,但是看資料量一般可以猜到是動態規劃,看看題目哈,如果某個人比別人年輕成績還比別人好就會衝突,那麼我們為了方便觀察資料,把所有人按年齡進行排序,比如這裡我自己寫一個樣例說明,排序好的結果如下:
[3,5,4,7,3,4,6,1]
[1,2,3,4,5,6,7,8]
可以看到,年齡排序好後,就是很明顯的在成績陣列中找一個上升序列(非嚴格上升序列,因為題目要求年齡小的人成績嚴格大於年齡大的才會衝突),然後讓這個上升序列和儘可能大,哈哈哈,是不是像極了求最長上升子序列,狀態轉移方程就是完全一樣的,不過長度變成了求和,但是這裡有一種情況,上述的樣例沒有年齡相同的,如果年齡相同怎麼處理呢?按照貪心的思想,因為我們是找上升序列,年齡相同的人一定不會衝突,那麼貪心來看就肯定優先把年齡相同的人,成績低的排前面,這樣可以讓這個上升序列更大,因此題目解答完畢。
AC程式碼
class Solution {
public:
struct Node
{
int scores;
int ages;
};
vector<Node>q;
int d[1010];
static int cmp(Node a1,Node a2)
{
if(a1.ages<a2.ages)return true;
if(a1.ages==a2.ages)return a1.scores<a2.scores;
return false;
}
int bestTeamScore(vector<int>& scores, vector<int>& ages) {
q.clear();
for(int i=0;i<scores.size();i++)
{
Node t;
t.scores=scores[i];
t.ages=ages[i];
q.push_back(t);
}
sort(q.begin(),q.end(),cmp);
for(int i=0;i<q.size();i++)
d[i]=q[i].scores;
//開始動態規劃求最大上升序列和
for(int i=0;i<q.size();i++)
{
for(int j=i-1;j>=0;j--)
{
if(q[i].scores>=q[j].scores)
{
d[i]=max(d[i],d[j]+q[i].scores);
}
}
}
int res=0;
for(int i=0;i<q.size();i++)
res=max(res,d[i]);
return res;
}
};
相關文章
- 動態規劃:最長上升子序列動態規劃
- 最長上升子序列動態規劃動態規劃
- 動態規劃-最長上升子序列模型動態規劃模型
- 動態規劃求解最長上升子序列問題動態規劃
- 最長上升子序列
- LeetCode 300. 最長上升子序列(Python、動態規劃、貪心演算法)LeetCodePython動態規劃演算法
- 北京大學郭煒-最長上升子序列 動態規劃講解動態規劃
- 死嗑 最長上升子序列(LIS)
- 線性dp:最長上升子序列
- 線性dp--最長上升子序列變形
- 動態規劃-最長公共子序列動態規劃
- 動態規劃——最長公共子序列動態規劃
- [線性dp] 合唱隊形(最長上升子序列模型)模型
- 最長上升子序列LIS 詳解+變形+擴充
- 【LeetCode動態規劃#14】子序列系列題(最長遞增子序列、最長連續遞增序列、最長重複子陣列、最長公共子序列)LeetCode動態規劃陣列
- 動態規劃(最長公共子序列LCS)動態規劃
- 力扣1143. 最長公共子序列 動態規劃之最長公共子序列力扣動態規劃
- 最長公共子序列問題—動態規劃sdut動態規劃
- 動態規劃經典問題----最長公共子序列動態規劃
- 動態規劃之最長公共子序列求解動態規劃
- [LeetCode解題] -- 動態規劃二 [ 子串、子序列問題 ]LeetCode動態規劃
- 詳解動態規劃最長公共子序列--JavaScript實現動態規劃JavaScript
- 最長上升子串
- 【部分轉載】:【lower_bound、upperbound講解、二分查詢、最長上升子序列(LIS)、最長下降子序列模版】
- bzoj3173: [Tjoi2013]最長上升子序列(樹狀陣列)陣列
- 動態規劃求最長降序序列動態規劃
- lgP1637 三元上升子序列
- P1637 三元上升子序列
- LeetCode 1143.最長公共子序列LeetCode
- 以最長公共子序列問題理解動態規劃演算法(DP)動態規劃演算法
- 淺談最長公共子序列引發的經典動態規劃問題動態規劃
- DP筆記最長上升子序列(LIS)以及零件分組問題筆記
- LeetCode516. 最長迴文子序列LeetCode
- 最長公共子序列
- 594. 最長和諧子序列
- 最長公共子序列(JAVA)Java
- 最長上升子序列——O (nlogn)演算法原因解析!為什麼這樣可以求出來!(附帶動態規劃dp + 二分查詢講解)演算法動態規劃
- [動態規劃] 六、最長迴文子串動態規劃