假设有几张卡片排成一行,每张卡片都有关联的点,这些点在称为cardPoints的整数数组中给出。第一步,我们可以从行的开头或结尾取出一张卡片。我们必须要拿k张卡。最终分数将是我们所取得的牌点的总和。因此,如果我们有整数数组cardPoints和整数k,则找到我们可以获得的最大分数。
因此,如果输入像cardPoints = [1,2,3,4,5,6,1],k = 3,那么输出将为12,因为在初始步骤之后,我们的得分将始终为1。 ,请先选择最右边的卡片,以使总分最大化。最佳策略是拿右边的三张牌,最终得分为1 + 6 + 5 = 12。
为了解决这个问题,我们将遵循以下步骤-
定义两个数组pre1和prev2并使用v对其进行初始化
ret:= 0
n:= v的大小
对于初始化i:= 1,当i <n时,更新(将i增加1),-
pre1 [i]:= pre1 [i] + pre1 [i-1]
对于初始化i:= n-2,当i> = 0时,更新(将i减1),执行-
pre2 [i]:= pre2 [i] + pre2 [i + 1]
如果k> = n,则-
返回pre1 [n-1]
i:= k-1
ret:= pre1 [i]
(将i减1)
j:= n-1
当我> = 0时,-
ret:= ret的最大值和(pre1 [i] + pre2 [j])
将i和j减1
ret:= ret和pre2 [n-k]的最大值
返回ret
让我们看下面的实现以更好地理解-
#include <bits/stdc++.h> using namespace std; class Solution { public: int maxScore(vector<int>& v, int k) { vector<int> pre1(v.begin(), v.end()); vector<int> pre2(v.begin(), v.end()); int ret = 0; int n = v.size(); for (int i = 1; i < n; i++) { pre1[i] += pre1[i - 1]; } for (int i = n - 2; i >= 0; i--) { pre2[i] += pre2[i + 1]; } if (k >= n) { return pre1[n - 1]; } int i = k - 1; ret = pre1[i]; i--; int j = n - 1; while (i >= 0) { ret = max(ret, pre1[i] + pre2[j]); i--; j--; } ret = max(ret, pre2[n - k]); return ret; } }; main(){ Solution ob; vector<int> v = {1,2,3,4,5,6,1}; cout << (ob.maxScore(v, 3)); }
{1,2,3,4,5,6,1}
输出结果
12