Maximice la suma de los números seleccionados de Array para vaciarlo | conjunto 2

Dada una array arr[] de N enteros, la tarea es maximizar la suma de los números seleccionados sobre todas las operaciones, de modo que en cada operación, elija un número A i , elimine una aparición del mismo y elimine todas las apariciones de A i – 1 y A i + 1 (si existen) en la array hasta que la array se vacía.

Ejemplos:

Entrada: arr[] = {3, 4, 2}
Salida: 6
Explicación: En la primera operación, seleccione 4 y elimínelo. Por lo tanto, todas las apariciones de 3 y 5 se eliminan de arr[]. La array después de la operación es arr[] = {2}. En la segunda operación, seleccione 2. Por lo tanto, la suma de todos los números seleccionados = 4+2 = 6, que es el máximo posible.

Entrada: arr[] = {2, 2, 3, 3, 3, 4}
Salida: 9
Explicación: En la primera operación, seleccione 3 y elimínelo. Por lo tanto, todas las apariciones de 2 y 4 se eliminan de arr[]. La array después de la operación es arr[] = {3, 3}. En la 2ª y 3ª operación, seleccione 3. Por lo tanto, la suma de todos los números seleccionados = 3+3+3 = 9, que es el máximo posible.

Enfoque: el problema dado se puede resolver contando la frecuencia de los elementos de la array y luego encontrar la suma máxima que se analiza en la publicación anterior de este artículo.

Complejidad de tiempo: O(M + F), donde M es el elemento máximo del arreglo y F es la frecuencia máxima de un elemento del arreglo .
Espacio Auxiliar: O(M), donde M es el elemento máximo del arreglo .

Enfoque de programación dinámica el enfoque anterior también se puede optimizar y resolver mediante la programación dinámica . Se puede observar que si se selecciona un número A i del arreglo arr[] , contribuirá A i * freq[A i ] a la suma final. Usando esta observación, siga los pasos a continuación para resolver el problema dado:

  • Cree una array freq[] , que almacene la frecuencia de cada elemento en la array arr[] .
  • Cree una array 1D dp[] , donde dp[i] representa la suma máxima posible de los valores seleccionados que se encuentran en el rango [1, i] en la array dada.
  • Para cada valor de i , hay dos casos posibles como sigue:
    • Caso 1, donde se selecciona i . En este caso, el valor de dp[i] = freq[i] * i + dp[i-2] .
    • Caso 2, donde se selecciona i – 1 . En este caso, el valor de dp[i] = dp[i-1] .
  • Por lo tanto, la relación DP del problema anterior es:

dp[i] = max( dp[i – 1], (freq[i] * i)+ dp[i – 2]) para todos los valores de i en el rango [0, MAX] donde MAX es el entero máximo en arr []

  • El valor almacenado en dp[MAX] es la respuesta requerida.

A continuación se muestra la implementación del enfoque anterior:

C++

// cpp program for the above approach
#include <bits/stdc++.h>
using namespace std;
 
// Function to find the maximum sum of
// selected numbers from an array to make
// the array empty
int maximizeSum(vector<int> arr)
{
 
    // Edge Case
    if (arr.size() == 0)
        return 0;
 
    // Stores the frequency of each element
    // in the range [0, MAX] where MAX is
    // the maximum integer in the array arr
 
    int mx= *max_element(arr.begin(),arr.end());
    int freq[mx + 1]={0};
 
    // Loop to iterate over array arr[]
    for (int i : arr)
        freq[i] += 1;
 
    // Stores the DP states
    int dp[mx + 1]={0};
 
    // Initially dp[1] = freq[1]
    dp[1] = freq[1];
 
    // Iterate over the range [2, MAX]
    for (int i = 2; i < mx + 1; i++)
        dp[i] = max(freq[i] * i + dp[i - 2],
                    dp[i - 1]);
 
    // Return Answer
    return dp[mx];
}
 
// Driver Code
int main()
{
    vector<int> arr = {2, 2, 3, 3, 3, 4};
 
    // Function Call
    cout << (maximizeSum(arr));
}
 
// This code is contributed by amreshkumar3.

Java

// java program for the above approach
class GFG
{
   
    // Utility function to find
    // maximum value of an element in array
    static int getMax(int [] arr)
    {
        int max = Integer.MIN_VALUE;
       
          for(int i = 0; i < arr.length; i++)
        {
           if(arr[i] > max)
             max = arr[i];
        }
       
          return max;
       
    }
   
    // Function to find the maximum sum of
    // selected numbers from an array to make
    // the array empty
    static int maximizeSum(int [] arr)
    {
 
        // Edge Case
        if (arr.length == 0)
            return 0;
 
        // Stores the frequency of each element
        // in the range [0, MAX] where MAX is
        // the maximum integer in the array arr
     
        int max = getMax(arr);
        int [] freq = new int[max + 1];
 
        // Loop to iterate over array arr[]
        for (int i : arr)
          freq[i] += 1;
 
        // Stores the DP states
        int[] dp = new int[max + 1];
 
        // Initially dp[1] = freq[1]
        dp[1] = freq[1];
 
        // Iterate over the range [2, MAX]
        for (int i = 2; i < max + 1; i++)
            dp[i] = Math.max(freq[i] * i + dp[i - 2],
                             dp[i - 1]);
 
        // Return Answer
        return dp[max];
    }
 
    // Driver Code
    public static void main(String [] args)
    {
        int [] arr = { 2, 2, 3, 3, 3, 4 };
 
        // Function Call
        System.out.println((maximizeSum(arr)));
    }
}
 
// This code is contributed by AR_Gaurav

Python3

# Python program for the above approach
 
# Function to find the maximum sum of
# selected numbers from an array to make
# the array empty
def maximizeSum(arr):
 
    # Edge Case
    if not arr:
        return 0
 
    # Stores the frequency of each element
    # in the range [0, MAX] where MAX is
    # the maximum integer in the array arr
    freq = [0] * (max(arr)+1)
 
    # Loop to iterate over array arr[]
    for i in arr:
        freq[i] += 1
 
    # Stores the DP states
    dp = [0] * (max(arr)+1)
 
    # Initially dp[1] = freq[1]
    dp[1] = freq[1]
 
    # Iterate over the range [2, MAX]
    for i in range(2, max(arr)+1):
        dp[i] = max(freq[i]*i + dp[i-2], dp[i-1])
 
    # Return Answer
    return dp[max(arr)]
 
# Driver Code
arr = [2, 2, 3, 3, 3, 4]
 
# Function Call
print(maximizeSum(arr))

C#

// C# program for the above approach
using System;
using System.Linq;
class GFG
{
   
    // Function to find the maximum sum of
    // selected numbers from an array to make
    // the array empty
    static int maximizeSum(int[] arr)
    {
 
        // Edge Case
        if (arr.Length == 0)
            return 0;
 
        // Stores the frequency of each element
        // in the range [0, MAX] where MAX is
        // the maximum integer in the array arr
        int[] freq = new int[(arr.Max() + 1)];
 
        // Loop to iterate over array arr[]
        foreach(int i in arr) freq[i] += 1;
 
        // Stores the DP states
        int[] dp = new int[(arr.Max() + 1)];
 
        // Initially dp[1] = freq[1]
        dp[1] = freq[1];
 
        // Iterate over the range [2, MAX]
        for (int i = 2; i < arr.Max() + 1; i++)
            dp[i] = Math.Max(freq[i] * i + dp[i - 2],
                             dp[i - 1]);
 
        // Return Answer
        return dp[arr.Max()];
    }
 
    // Driver Code
    public static void Main()
    {
        int[] arr = { 2, 2, 3, 3, 3, 4 };
 
        // Function Call
        Console.WriteLine((maximizeSum(arr)));
    }
}
 
// This code is contributed by ukasp.

Javascript

<script>
      // JavaScript Program to implement
      // the above approach
 
      // Function to find the maximum sum of
      // selected numbers from an array to make
      // the array empty
      function maximizeSum(arr) {
 
          // Edge Case
          if (arr.length == 0)
              return 0;
 
          // Stores the frequency of each element
          // in the range [0, MAX] where MAX is
          // the maximum integer in the array arr
          let freq = new Array(Math.max(...arr) + 1).fill(0);
 
          // Loop to iterate over array arr[]
          for (let i = 0; i < arr.length; i++)
              freq[arr[i]] += 1
 
          // Stores the DP states
          let dp = new Array(Math.max(...arr) + 1).fill(0);
 
 
          // Initially dp[1] = freq[1]
          dp[1] = freq[1]
 
          // Iterate over the range [2, MAX]
          for (let i = 2; i <= Math.max(...arr) + 1; i++)
              dp[i] = Math.max(freq[i] * i + dp[i - 2], dp[i - 1])
 
          // Return Answer
          return dp[Math.max(...arr)]
      }
      // Driver Code
      let arr = [2, 2, 3, 3, 3, 4]
 
      // Function Call
      document.write(maximizeSum(arr))
       
   // This code is contributed by Potta Lokesh
 
  </script>
Producción: 

9

 

Complejidad temporal: O(M + F), donde M es el elemento máximo del arreglo .
Espacio Auxiliar: O(M), donde M es el elemento máximo del arreglo .

Publicación traducida automáticamente

Artículo escrito por saikumarkudikala y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *