查找可以通过从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 1l = 1, r = 1
输出结果
8
在这里,我们选择2删除,则分别对于给定的l和r范围,将需要删除(2-1)= 1和(2 + 1)= 3。
重复此过程,直到2被完全删除。因此,总成本= 2 * 4 = 8。
输入值
2 4 2 10 5l = 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