LeetCode 1626. 無矛盾的最佳球隊---【動態規劃】最長上升子序列變換版-->最大上升子序列和

Guapifang發表於2020-11-19
  1. 無矛盾的最佳球隊

假設你是球隊的經理。對於即將到來的錦標賽,你想組合一支總體得分最高的球隊。球隊的得分是球隊中所有球員的分數 總和 。

然而,球隊中的矛盾會限制球員的發揮,所以必須選出一支 沒有矛盾 的球隊。如果一名年齡較小球員的分數 嚴格大於 一名年齡較大的球員,則存在矛盾。同齡球員之間不會發生矛盾。

給你兩個列表 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;
    }
};

在這裡插入圖片描述

相關文章