在 C++ 中查找从数组中删除元素可以获得的最大点数
概念
对于给定的包含 N 个元素的数组 A 以及两个整数 l 和 r,其中 1≤ ax ≤ 105 且 1≤ l≤ r≤ N。我们可以选择数组中的任何元素(假设为 ax)并将其删除,并且还删除数组中等于 ax+1、ax+2 … ax+R 和 ax-1、ax-2 … ax-L 的所有元素。此步骤将花费 ax 分。我们的任务是在删除数组中的所有元素后最大化总成本。
输入
2 1 2 3 2 2 1 l = 1, r = 1
输出
8
在这里,我们选择 2 进行删除,然后 (2-1)=1 和 (2+1)=3 将需要根据给定的 l 和 r 范围分别删除。
重复此操作,直到 2 完全删除。因此,总成本 = 2*4 = 8。
输入
2 4 2 10 5 l = 1, r = 2
输出
18
在这里,我们选择 2 进行删除,然后是 5,然后是 10。
因此,总成本 = 2*2 + 5 + 10 = 19。
方法
现在,我们将确定所有元素的计数。假设选择了元素 X,那么将删除范围 [X-l, X+r] 中的所有元素。目前,我们从 l 和 r 中选择最小范围,并确定当选择元素 X 时要删除哪些元素。结果将是先前删除元素的最大值以及删除元素 X 时的最大值。现在,我们将实现动态规划来存储先前删除元素的结果,并进一步实现它。
示例
// C++ program to find maximum cost after
// deleting all the elements form the array
#include <bits/stdc++.h>
using namespace std;
// Shows function to return maximum cost obtained
int maxCost(int a[], int m, int L, int R){
int mx1 = 0, k1;
// Determine maximum element of the array.
for (int p = 0; p < m; ++p)
mx1 = max(mx1, a[p]);
// Used to initialize count of all elements to zero.
int count1[mx1 + 1];
memset(count1, 0, sizeof(count1));
// Compute frequency of all elements of array.
for (int p = 0; p < m; p++)
count1[a[p]]++;
// Used to store cost of deleted elements.
int res1[mx1 + 1];
res1[0] = 0;
// Choosing minimum range from L and R.
L = min(L, R);
for (int num1 = 1; num1 <= mx1; num1++) {
// Determines upto which elements are to be
// deleted when element num is selected.
k1 = max(num1 - L - 1, 0);
// Obtain maximum when selecting element num or not.
res1[num1] = max(res1[num1 - 1], num1 * count1[num1] +
res1[k1]);
}
return res1[mx1];
}
// Driver program
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;
// size of array
int n1 = sizeof(a1) / sizeof(a1[0]);
int n2 = sizeof(a2) / sizeof(a2[0]);
// function call to find maximum cost
cout<<"Maximum Cost for First Example:" << maxCost(a1, n1, l1,r1)<<endl;
cout<<"Maximum Cost for Second Example:" << maxCost(a2, n2, l2,r2);
return 0;
}输出
Maximum Cost for First Example:11 Maximum Cost for Second Example:19
广告
数据结构
网络
关系数据库管理系统
操作系统
Java
iOS
HTML
CSS
Android
Python
C 编程
C++
C#
MongoDB
MySQL
Javascript
PHP