<p>You are the manager of a basketball team. For the upcoming tournament, you want to choose the team with the highest overall score. The score of the team is the <strong>sum</strong> of scores of all the players in the team.</p>

<p>However, the basketball team is not allowed to have <strong>conflicts</strong>. A <strong>conflict</strong> exists if a younger player has a <strong>strictly higher</strong> score than an older player. A conflict does <strong>not</strong> occur between players of the same age.</p>

<p>Given two lists, <code>scores</code> and <code>ages</code>, where each <code>scores[i]</code> and <code>ages[i]</code> represents the score and age of the <code>i<sup>th</sup></code> player, respectively, return <em>the highest overall score of all possible basketball teams</em>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>

<pre>
<strong>Input:</strong> scores = [1,3,5,10,15], ages = [1,2,3,4,5]
<strong>Output:</strong> 34
<strong>Explanation:</strong>&nbsp;You can choose all the players.
</pre>

<p><strong class="example">Example 2:</strong></p>

<pre>
<strong>Input:</strong> scores = [4,5,6,5], ages = [2,1,2,1]
<strong>Output:</strong> 16
<strong>Explanation:</strong>&nbsp;It is best to choose the last 3 players. Notice that you are allowed to choose multiple people of the same age.
</pre>

<p><strong class="example">Example 3:</strong></p>

<pre>
<strong>Input:</strong> scores = [1,2,3,5], ages = [8,9,10,1]
<strong>Output:</strong> 6
<strong>Explanation:</strong>&nbsp;It is best to choose the first 3 players. 
</pre>

<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>1 &lt;= scores.length, ages.length &lt;= 1000</code></li>
	<li><code>scores.length == ages.length</code></li>
	<li><code>1 &lt;= scores[i] &lt;= 10<sup>6</sup></code></li>
	<li><code>1 &lt;= ages[i] &lt;= 1000</code></li>
</ul>

class Solution:
    def bestTeamScore(self, scores: List[int], ages: List[int]) -> int:
        #sorting things
        h={}
        for i in range(len(ages)):
            if ages[i] in h:
                h[ages[i]].append(scores[i])
            else:
                h[ages[i]]=[scores[i]]
        ages.sort()
        scores = []
        for age in ages:
            if h[age]!=[]:
                h[age].sort()
                for score in h[age]:
                    scores.append(score)
                h[age]=[]
        print(ages)
        print(scores)

        #uniques of scores
        s={}
        for score in scores:
            s[score]=True
        scoresSorted=[score for score in s]
        scoresSorted.sort()
        m = len(scoresSorted)
        n = len(ages)
        dp = [[0 for k in range(n)] for i in range(m)]
        indx={}
        for i in range(m):
            indx[scoresSorted[i]]=i
        #dp[i][k]: ans for [:k+1] with individual scores capped at scores[i]
        #dp[score][k]: if scores[k]> score=> dp[score][k-1]
        #dp[score][k]: if scores[k]<= score=> max(dp[score][k-1], scores[k]+dp[scores[k]][k-1])
        #init
        print(scoresSorted)
        print(indx)
        for i in range(m):
            dp[i][0]= scores[0]*(scores[0]<=scoresSorted[i])

        for i in range(m):
            for k in range(1,n):
                if scores[k]>scoresSorted[i]:
                    dp[i][k] = dp[i][k-1]
                if scores[k]<=scoresSorted[i]:
                    dp[i][k]=max(dp[i][k-1], scores[k]+dp[indx[scores[k]]][k-1])
        #for r in dp:
        #    print(r)
        return dp[-1][-1]


26400