您可以从C ++卡中获得的最高积分

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