给定具有N个元素和两个整数L和R的数组A ,其中, 和 。您可以选择数组中的任何元素(假设为x )并将其删除,还可以删除等于a x +1 , a x +2 … a x + R和a x -1 , a x -2 …的所有元素。数组中的x -L此步骤将花费x点。任务是从阵列中删除所有元素后,使总成本最大化。
例子:
Input : 2 1 2 3 2 2 1
L = 1, R = 1
Output : 8
We select 2 to delete, then (2-1)=1 and (2+1)=3 will need to be deleted,
for given L and R range respectively.
Repeat this until 2 is completely removed. So, total cost = 2*4 = 8.
Input : 2 4 2 9 5
L = 1, R = 2
Output : 18
We select 2 to delete, then 5 and then 9.
So total cost = 2*2 + 5 + 9 = 18.
方法:我们将找到所有元素的数量。现在假设选择了元素X,然后将删除[XL,X + R]范围内的所有元素。现在,我们从L和R中选择最小范围,并找到选择元素X时要删除的元素。当删除元素X时,我们的结果将是先前删除的元素的最大值。我们将使用动态编程来存储先前删除的元素的结果,并进一步使用它。
C++
// C++ program to find maximum cost after
// deleting all the elements form the array
#include
using namespace std;
// function to return maximum cost obtained
int maxCost(int a[], int n, int l, int r)
{
int mx = 0, k;
// find maximum element of the array.
for (int i = 0; i < n; ++i)
mx = max(mx, a[i]);
// initialize count of all elements to zero.
int count[mx + 1];
memset(count, 0, sizeof(count));
// calculate frequency of all elements of array.
for (int i = 0; i < n; i++)
count[a[i]]++;
// stores cost of deleted elements.
int res[mx + 1];
res[0] = 0;
// selecting minimum range from L and R.
l = min(l, r);
for (int num = 1; num <= mx; num++) {
// finds upto which elements are to be
// deleted when element num is selected.
k = max(num - l - 1, 0);
// get maximum when selecting element num or not.
res[num] = max(res[num - 1], num * count[num] + res[k]);
}
return res[mx];
}
// Driver program
int main()
{
int a[] = { 2, 1, 2, 3, 2, 2, 1 }, l = 1, r = 1;
// size of array
int n = sizeof(a) / sizeof(a[0]);
// function call to find maximum cost
cout << maxCost(a, n, l, r);
return 0;
}
Java
//Java program to find maximum cost after
//deleting all the elements form the array
public class GFG {
//function to return maximum cost obtained
static int maxCost(int a[], int n, int l, int r)
{
int mx = 0, k;
// find maximum element of the array.
for (int i = 0; i < n; ++i)
mx = Math.max(mx, a[i]);
// initialize count of all elements to zero.
int[] count = new int[mx + 1];
for(int i = 0; i < count.length; i++)
count[i] = 0;
// calculate frequency of all elements of array.
for (int i = 0; i < n; i++)
count[a[i]]++;
// stores cost of deleted elements.
int[] res = new int[mx + 1];
res[0] = 0;
// selecting minimum range from L and R.
l = Math.min(l, r);
for (int num = 1; num <= mx; num++) {
// finds upto which elements are to be
// deleted when element num is selected.
k = Math.max(num - l - 1, 0);
// get maximum when selecting element num or not.
res[num] = Math.max(res[num - 1], num * count[num] + res[k]);
}
return res[mx];
}
//Driver program
public static void main(String[] args) {
int a[] = { 2, 1, 2, 3, 2, 2, 1 }, l = 1, r = 1;
// size of array
int n = a.length;
// function call to find maximum cost
System.out.println(maxCost(a, n, l, r));
}
}
Python 3
# Python 3 Program to find maximum cost after
# deleting all the elements form the array
# function to return maximum cost obtained
def maxCost(a, n, l, r) :
mx = 0
# find maximum element of the array.
for i in range(n) :
mx = max(mx, a[i])
# create and initialize count of all elements to zero.
count = [0] * (mx + 1)
# calculate frequency of all elements of array.
for i in range(n) :
count[a[i]] += 1
# stores cost of deleted elements.
res = [0] * (mx + 1)
res[0] = 0
# selecting minimum range from L and R.
l = min(l, r)
for num in range(1, mx + 1) :
# finds upto which elements are to be
# deleted when element num is selected.
k = max(num - l - 1, 0)
# get maximum when selecting element num or not.
res[num] = max(res[num - 1], num * count[num] + res[k])
return res[mx]
# Driver code
if __name__ == "__main__" :
a = [2, 1, 2, 3, 2, 2, 1 ]
l, r = 1, 1
# size of array
n = len(a)
# function call to find maximum cost
print(maxCost(a, n, l, r))
# This code is contributed by ANKITRAI1
C#
// C# program to find maximum cost
// after deleting all the elements
// form the array
using System;
class GFG
{
// function to return maximum
// cost obtained
static int maxCost(int []a, int n,
int l, int r)
{
int mx = 0, k;
// find maximum element
// of the array.
for (int i = 0; i < n; ++i)
mx = Math.Max(mx, a[i]);
// initialize count of all
// elements to zero.
int[] count = new int[mx + 1];
for(int i = 0; i < count.Length; i++)
count[i] = 0;
// calculate frequency of all
// elements of array.
for (int i = 0; i < n; i++)
count[a[i]]++;
// stores cost of deleted elements.
int[] res = new int[mx + 1];
res[0] = 0;
// selecting minimum range
// from L and R.
l = Math.Min(l, r);
for (int num = 1; num <= mx; num++)
{
// finds upto which elements
// are to be deleted when
// element num is selected.
k = Math.Max(num - l - 1, 0);
// get maximum when selecting
// element num or not.
res[num] = Math.Max(res[num - 1], num *
count[num] + res[k]);
}
return res[mx];
}
// Driver Code
public static void Main()
{
int []a = { 2, 1, 2, 3, 2, 2, 1 };
int l = 1, r = 1;
// size of array
int n = a.Length;
// function call to find maximum cost
Console.WriteLine(maxCost(a, n, l, r));
}
}
// This code is contributed
// by inder_verma
输出:
8
时间复杂度: O(max(A))