# 2542. Maximum Subsequence Score
###### tags: `Python`,`Leetcode`
https://leetcode.com/problems/maximum-subsequence-score/description/
## Code
``` python=
class Solution:
def maxScore(self, nums1: List[int], nums2: List[int], k: int) -> int:
total = 0
res = 0
heap = []
pairs = zip(nums1,nums2)
sorted_pairs = sorted(pairs, key = lambda x:x[1], reverse = True)
for pair in sorted_pairs:
num1,num2 = pair
heappush(heap,num1)
total += num1
if len(heap)>k:
total -= heappop(heap)
if len(heap) == k :
res = max(res, total*num2)
return res
```
## 題意
* 這道題目要求從兩個相等長度的陣列 nums1 和 nums2 中各選擇一個長度為 k 的子序列
* 對於所選的索引子序列,我們需要計算一個分數,該分數由以下公式給出:
1. 分數 = (nums1[i0] + nums1[i1] + ... + nums1[ik-1]) * min(nums2[i0], nums2[i1], ..., nums2[ik-1])
2. 其中i0, i1, ..., ik-1為所選的索引,min()表示選擇的nums2元素的最小值。
* 我們的目標是找到可能的最大分數。
## 思路
* 使用 nums2 的序列由大到小排序 pairs = zip(nums1,nums2)
* 遍歷每個 pairs ,計算目前的 total 並乘上目前的 nums 2,如果得出來的答案有比前一個大,就更新 res (用來儲存目前最大的結果)
## 解法
``` python=
class Solution:
def maxScore(self, nums1: List[int], nums2: List[int], k: int) -> int:
total = 0 # 用來算 nums1 的總和
res = 0 # 用來更新分數
heap =
pairs = zip(nums1,nums2) # 把 nums1 、 nums2 壓成對,這樣他們才會共用 index
sorted_pairs = sorted(pairs, key = lambda x:x[1], reverse = True) # 依照 nums2 把 pair 由大到小排列
for pair in sorted_pairs:
num1,num2 = pair
heappush(heap,num1) # 把 num1 一個一個擠進去 heap
total += num1 # 算 nums1 的總和
if len(heap)>k: # 如果 heap 超過指定長度,把最小的丟掉、剪掉
total -= heappop(heap)
if len(heap) == k :
res = max(res, total*num2)# 用來更新分數
return res
```
* 使用 nums2 去做排序的目的是為了在遍歷時能夠優先處理較大的 nums2 元素,從而使得得分最大化