假设有几张卡片排成一行,每张卡片都有关联的点,这些点在称为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