Puntaje máximo de eliminar un elemento de una array según la condición dada

Dada una array arr[] , la tarea es encontrar la puntuación máxima de eliminación de un elemento donde cada elemento de la array se puede eliminar con la puntuación del elemento, pero la restricción es si eliminamos arr[i] , luego arr[ i] + 1 y arr[i] – 1 se eliminan automáticamente con 0 puntuaciones.
Ejemplos: 

Entrada: arr[] = {7, 2, 1, 8, 3, 3, 6, 6} 
Salida: 27 
Explicación:  
Paso 0: arr[] = 7 2 1 8 3 3 6 6, Puntuación:
Paso 1: arr[] = 7 1 8 3 6 6, Puntuación:
Paso 2: arr[] = 7 1 8 6 6, Puntuación:
Paso 3: arr[] = 7 8 6 6, Puntuación:
Paso 4: arr[ ] = 8 6 , Puntuación: 13 
Paso 5: arr[] = 8 Puntuación: 19 
Paso 6: arr[] = [] Puntuación:27
Entrada: arr[] = 1 2 3 
Salida:
 

Enfoque: La idea es utilizar Programación Dinámica para resolver este problema. La observación clave del problema es que para eliminar cualquier elemento de la array, la ocurrencia del elemento y el valor en sí mismo es el factor importante.
Pongamos un ejemplo para entender la observación si la secuencia fuera 4 4 5. Entonces, tenemos dos opciones para elegir de 4 a 5. Ahora, al elegir 4, su puntuación sería 4*2 = 8. Por otro lado, si elegimos 5, su puntaje sería 5*1 = 5. Claramente, el puntaje máximo es 8.
Por lo tanto, para la secuencia anterior 4 4 5, freq[4] = 2 y freq[5] = 1.
Finalmente, para encontrar el puntaje óptimo, sería fácil primero dividir el problema en un problema más pequeño. En este caso, dividimos la secuencia en secuencias más pequeñas y encontramos una solución óptima para ella. Para la secuencia de números que contiene solo 0, la respuesta sería 0. De manera similar, si una secuencia contiene solo el número 0 y 1, entonces la solución sería cuenta[1]*1.
Relación de recurrencia: 

dp[i] = max(dp[i – 1], dp[i – 2] + i*frecuencia[i]) 
 

Básicamente, tenemos 2 casos, ya sea para elegir un i -ésimo elemento y otro es para no elegir un i -ésimo elemento.

Caso 1: Si elegimos el i-ésimo elemento, la puntuación máxima hasta el i-ésimo elemento será dp[i-2] + i*freq[i] (elegir el i-ésimo elemento significa eliminar el (i-1)-ésimo elemento) 
Caso 2: Si no elija el i-ésimo elemento, la puntuación máxima hasta el i-ésimo elemento será dp[i-1] 
Ahora que tenemos que maximizar la puntuación, tomaremos el máximo de ambos.
A continuación se muestra la implementación del enfoque anterior:
 

C++

// C++ implementation to find the
// maximum score of the deleting a
// element from an array
 
#include <bits/stdc++.h>
 
using namespace std;
 
// Function to find the maximum
// score of the deleting an element
// from an array
int findMaximumScore(vector<int> a, int n)
{
 
    // Creating a map to keep
    // the frequency of numbers
    unordered_map<int, int> freq;
 
    // Loop to iterate over the
    // elements of the array
    for (int i = 0; i < n; i++) {
        freq[a[i]]++;
    }
 
    // Creating a DP array to keep
    // count of max score at ith element
    // and it will be filled
    // in the bottom Up manner
    vector<int> dp(*max_element(a.begin(),
                                a.end())
                       + 1,
                   0);
    dp[0] = 0;
    dp[1] = freq[1];
 
    // Loop to choose the elements of the
    // array to delete from the array
    for (int i = 2; i < dp.size(); i++)
        dp[i] = max(
            dp[i - 1],
            dp[i - 2] + freq[i] * i);
 
    return dp[dp.size() - 1];
}
 
// Driver Code
int main()
{
    int n;
    n = 3;
    vector<int> a{ 1, 2, 3 };
 
    // Function Call
    cout << findMaximumScore(a, n);
    return 0;
}

Java

// Java implementation to find the
// maximum score of the deleting a
// element from an array
import java.util.*;
 
class GFG{
 
// Function to find the maximum
// score of the deleting an element
// from an array
static int findMaximumScore(int []a, int n)
{
     
    // Creating a map to keep
    // the frequency of numbers
    @SuppressWarnings("unchecked")
    HashMap<Integer,
            Integer> freq = new HashMap();
 
    // Loop to iterate over the
    // elements of the array
    for(int i = 0; i < n; i++)
    {
        if(freq.containsKey(a[i]))
        {
            freq.put(a[i],
                     freq.get(a[i]) + 1);
        }
        else
        {
            freq.put(a[i], 1);
        }
    }
 
    // Creating a DP array to keep
    // count of max score at ith element
    // and it will be filled
    // in the bottom Up manner
    int []dp = new int[Arrays.stream(a).max().getAsInt() + 1];
    dp[0] = 0;
    dp[1] = freq.get(1);
 
    // Loop to choose the elements of the
    // array to delete from the array
    for(int i = 2; i < dp.length; i++)
        dp[i] = Math.max(dp[i - 1],
                         dp[i - 2] +
                       freq.get(i) * i);
 
    return dp[dp.length - 1];
}
 
// Driver Code
public static void main(String[] args)
{
    int n;
    n = 3;
    int []a = { 1, 2, 3 };
 
    // Function call
    System.out.print(findMaximumScore(a, n));
}
}
 
// This code is contributed by 29AjayKumar

Python3

# Python3 implementation to find the
# maximum score of the deleting a
# element from an array
from collections import defaultdict
 
# Function to find the maximum
# score of the deleting an element
# from an array
def findMaximumScore(a, n):
   
    # Creating a map to keep
    # the frequency of numbers
    freq = defaultdict (int)
 
    # Loop to iterate over the
    # elements of the array
    for i in range (n):
        freq[a[i]] += 1
 
    # Creating a DP array to keep
    # count of max score at ith element
    # and it will be filled
    # in the bottom Up manner
    dp = [0] * (max(a) + 1)
    dp[0] = 0
    dp[1] = freq[1]
 
    # Loop to choose the elements of the
    # array to delete from the array
    for i in range (2, len(dp)):
        dp[i] = max(dp[i - 1],
                    dp[i - 2] +
                    freq[i] * i)
 
    return dp[- 1]
 
# Driver Code
if __name__ == "__main__":
   
    n = 3
    a = [1, 2, 3]
 
    # Function Call
    print(findMaximumScore(a, n))
 
# This code is contributed by Chitranayal

C#

// C# implementation to find the
// maximum score of the deleting a
// element from an array
using System;
using System.Linq;
using System.Collections.Generic;
 
class GFG{
 
// Function to find the maximum
// score of the deleting an element
// from an array
static int findMaximumScore(int []a, int n)
{
     
    // Creating a map to keep
    // the frequency of numbers
    Dictionary<int,
               int> freq = new Dictionary<int,
                                          int>();
 
    // Loop to iterate over the
    // elements of the array
    for(int i = 0; i < n; i++)
    {
        if(freq.ContainsKey(a[i]))
        {
            freq[a[i]] = freq[a[i]] + 1;
        }
        else
        {
            freq.Add(a[i], 1);
        }
    }
 
    // Creating a DP array to keep
    // count of max score at ith element
    // and it will be filled
    // in the bottom Up manner
    int []dp = new int[a.Max() + 1];
    dp[0] = 0;
    dp[1] = freq[1];
 
    // Loop to choose the elements of the
    // array to delete from the array
    for(int i = 2; i < dp.Length; i++)
        dp[i] = Math.Max(dp[i - 1],
                         dp[i - 2] +
                       freq[i] * i);
 
    return dp[dp.Length - 1];
}
 
// Driver Code
public static void Main(String[] args)
{
    int n;
    n = 3;
    int []a = { 1, 2, 3 };
     
    // Function call
    Console.Write(findMaximumScore(a, n));
}
}
 
// This code is contributed by 29AjayKumar

Javascript

<script>
// Javascript implementation to find the
// maximum score of the deleting a
// element from an array
 
// Function to find the maximum
// score of the deleting an element
// from an array
function findMaximumScore(a,n)
{
    // Creating a map to keep
    // the frequency of numbers
    let freq = new Map();
   
    // Loop to iterate over the
    // elements of the array
    for(let i = 0; i < n; i++)
    {
        if(freq.has(a[i]))
        {
            freq.set(a[i],
                     freq.get(a[i]) + 1);
        }
        else
        {
            freq.set(a[i], 1);
        }
    }
   
    // Creating a DP array to keep
    // count of max score at ith element
    // and it will be filled
    // in the bottom Up manner
    let dp = new Array(Math.max(...a)+1);
    dp[0] = 0;
    dp[1] = freq.get(1);
   
    // Loop to choose the elements of the
    // array to delete from the array
    for(let i = 2; i < dp.length; i++)
        dp[i] = Math.max(dp[i - 1],
                         dp[i - 2] +
                       freq.get(i) * i);
   
    return dp[dp.length - 1];
}
 
// Driver Code
let n = 3;
let a=[1, 2, 3];
 
// Function call
document.write(findMaximumScore(a, n));
 
// This code is contributed by avanitrachhadiya2155
</script>
Producción: 

4

 

Complejidad de tiempo: O(N)

Espacio Auxiliar: O(N)

Publicación traducida automáticamente

Artículo escrito por deepak19engg 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 *