查找可以通过从C ++中删除数组中的元素获得的最大点数

概念

对于具有N个单元和两个整数L和R,其中,1≤一给定阵列A的X ≤10 5和1≤L≤R≤N.我们可以选择阵列中的任何元件(比方说AX),并删除它,并从数组中删除等于x + 1,a x +2…a x + R和a x -1,a x -2…a x -L的所有元素。此步骤将花费斧头点数。我们的任务是在删除数组中的所有元素后使总成本最大化。

输入值

2 1 2 3 2 2 1

l = 1, r = 1

输出结果

8

在这里,我们选择2删除,则分别对于给定的l和r范围,将需要删除(2-1)= 1和(2 + 1)= 3。

重复此过程,直到2被完全删除。因此,总成本= 2 * 4 = 8。

输入值

2 4 2 10 5

l = 1, r = 2

输出结果

18

在这里,我们选择2删除,然后选择5再选择10。

因此总成本= 2 * 2 + 5 + 10 = 19。

方法

现在,我们将确定所有元素的数量。假设选择了元素X,则将删除[Xl,X + r]范围内的所有元素。目前,我们从l和r中选择最小范围,并确定选择元素X时要删除的元素。结果将是先前删除的元素以及删除元素X时的最大值。现在,我们将实现动态编程,以存储先前删除的元素的结果并进一步实现。

示例

// C++ program to find maximum cost after

//删除数组中的所有元素

#include <bits/stdc++.h>

using namespace std;

//显示函数返回获得的最大成本

int maxCost(int a[], int m, int L, int R){

   int mx1 = 0, k1;

   //确定数组的最大元素。

   for (int p = 0; p < m; ++p)

      mx1 = max(mx1, a[p]);

   //用于将所有元素的计数初始化为零。

   int count1[mx1 + 1];

   memset(count1, 0, sizeof(count1));

   //计算数组所有元素的频率。

   for (int p = 0; p < m; p++)

      count1[a[p]]++;

   //用于存储已删除元素的成本。

   int res1[mx1 + 1];

   res1[0] = 0;

   //从L和R中选择最小范围。-

   L = min(L, R);

   for (int num1 = 1; num1 <= mx1; num1++) {

      //确定最多要包含哪些元素

      //选择元素num时删除。

      k1 = max(num1 - L - 1, 0);

      //是否选择元素num时获得最大值。

      res1[num1] = max(res1[num1 - 1], num1 * count1[num1] +

      res1[k1]);

   }

   return res1[mx1];

}

//驱动程序

int main(){

   int a1[] = { 1, 1, 3, 3, 3, 2, 4 }, l1 = 1, r1 = 1;

   int a2[] = { 2, 4, 2, 10, 5 }, l2 = 1, r2 = 2;

   //数组大小

   int n1 = sizeof(a1) / sizeof(a1[0]);

   int n2 = sizeof(a2) / sizeof(a2[0]);

   //函数调用以查找最大成本

   cout<<"第一个示例的最高费用:" << maxCost(a1, n1, l1,r1)<<endl;

   cout<<"第二个示例的最高费用:" << maxCost(a2, n2, l2,r2);

   return 0;

}

输出结果

第一个示例的最高费用:11

第二个示例的最高费用:19

以上是 查找可以通过从C ++中删除数组中的元素获得的最大点数 的全部内容, 来源链接: utcz.com/z/316808.html

回到顶部