Suma máxima de Subconjunto que no tiene elementos consecutivos

Dada una array arr[] de tamaño N , la tarea es encontrar la suma máxima posible de un subconjunto de la array tal que no haya dos elementos consecutivos que formen parte del subconjunto.

Ejemplos :

Entrada: arr[] = {2, 3, 2, 3, 3, 4}
Salida: 9
Explicación: El subconjunto que tiene todos los 3, es decir, {3, 3, 3} tiene suma = 9.
Esta es la suma máxima posible de cualquier subconjunto posible de la array que sigue a la condición.

Entrada: arr[] = {2, 3, 4}
Salida: 6
Explicación: El subconjunto es {2, 4}. Tiene suma = 6 que es el máximo posible. 

 

Enfoque ingenuo : el enfoque ingenuo es generar todos los subconjuntos posibles y, a partir de ellos, verificar qué subconjuntos siguen la condición dada. Calcula la suma de esos subconjuntos y el máximo entre ellos es la respuesta requerida.

Complejidad de Tiempo: O(2 N )
Espacio Auxiliar: O(2 N )

Enfoque eficiente: un enfoque eficiente es utilizar la programación dinámica con la ayuda de la siguiente idea:

Para cualquier elemento X en arr[], el valor X-1 no puede ser considerado pero todos los elementos que tienen valor X pueden serlo. Entonces, para X, la máxima respuesta posible hasta X es máxima entre (máxima respuesta posible hasta X-2 + freq(X)*X) y (máxima respuesta posible hasta X-1)

Siga los pasos que se mencionan a continuación para resolver el problema: 

  • Utilice hashing para almacenar la frecuencia de cada elemento.
  • Encuentre el valor máximo de la array. (decir X )
  • Cree una array dp[] donde dp[i] almacene la suma máxima posible del subconjunto cuando los elementos con valor como máximo i estén incluidos en el subconjunto.
  • Iterar de i = 2 a X de la array:
    • Calcule el valor de dp[i] según la fórmula de la observación dp[i] = max(dp[i-2] + i*freq(i), dp[i-1]) .
  • El valor máximo de la array dp[] es la respuesta.

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

C++

// C++ code to implement the approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to calculate the maximum value
int MaximiseStockPurchase(vector<int>& nums,
                          int n)
{
    int maxi = 0;
    for (int i = 0; i < n; i++)
        maxi = max(maxi, nums[i]);
 
    vector<int> freq(maxi + 1, 0);
    vector<int> dp(maxi + 1, 0);
 
    for (auto i : nums)
        freq[i]++;
    dp[1] = freq[1];
 
    // Loop to calculate dp[] array
    // till max element of array
    for (int i = 2; i <= maxi; i++)
        dp[i] = max(dp[i - 2] + i * freq[i],
                    dp[i - 1]);
 
    return dp[maxi];
}
 
// Driver code
int main()
{
    vector<int> arr{ 2, 2, 3, 4, 3, 3 };
    int N = arr.size();
 
    int res = MaximiseStockPurchase(arr, N);
    cout << res;
    return 0;
}

Java

// Java code to implement the approach
import java.io.*;
 
class GFG {
 
  // Function to calculate the maximum value
  static int MaximiseStockPurchase(int nums[],
                                   int n)
  {
    int maxi = 0;
    for (int i = 0; i < n; i++)
      maxi = Math.max(maxi, nums[i]);
 
    int freq[] = new int[maxi + 1];
    int dp[] = new int[maxi + 1];
 
    for (int i = 0; i < n; i++)
      freq[nums[i]]++;
    dp[1] = freq[1];
 
    // Loop to calculate dp[] array
    // till max element of array
    for (int i = 2; i <= maxi; i++)
      dp[i] = Math.max(dp[i - 2] + i * freq[i],
                       dp[i - 1]);
 
    return dp[maxi];
  }
 
  // Driver code
  public static void main (String[] args) {
    int arr[] = { 2, 2, 3, 4, 3, 3 };
    int N = arr.length;
 
    int res = MaximiseStockPurchase(arr, N);
    System.out.println(res);
  }
}
 
// This code is contributed by hrithikgarg03188.

Python3

# Python 3 code to implement the approach
 
# Function to calculate the maximum value
def MaximiseStockPurchase(nums, n):
    maxi = 0
    for i in range(n):
        maxi = max(maxi, nums[i])
 
    freq = [0]*(maxi + 1)
    dp = [0] * (maxi + 1)
 
    for i in nums:
        freq[i] += 1
    dp[1] = freq[1]
 
    # Loop to calculate dp[] array
    # till max element of array
    for i in range(2,  maxi + 1):
        dp[i] = max(dp[i - 2] + i * freq[i],
                    dp[i - 1])
 
    return dp[maxi]
 
# Driver code
if __name__ == "__main__":
 
    arr = [2, 2, 3, 4, 3, 3]
    N = len(arr)
 
    res = MaximiseStockPurchase(arr, N)
    print(res)
 
    # This code is contributed by ukasp.

C#

// C# code to implement the approach
using System;
class GFG {
 
  // Function to calculate the maximum value
  static int MaximiseStockPurchase(int[] nums, int n)
  {
    int maxi = 0;
    for (int i = 0; i < n; i++)
      maxi = Math.Max(maxi, nums[i]);
 
    int[] freq = new int[maxi + 1];
    int[] dp = new int[maxi + 1];
 
    for (int i = 0; i < n; i++)
      freq[nums[i]]++;
    dp[1] = freq[1];
 
    // Loop to calculate dp[] array
    // till max element of array
    for (int i = 2; i <= maxi; i++)
      dp[i] = Math.Max(dp[i - 2] + i * freq[i],
                       dp[i - 1]);
 
    return dp[maxi];
  }
 
  // Driver code
  public static void Main()
  {
    int[] arr = { 2, 2, 3, 4, 3, 3 };
    int N = arr.Length;
 
    int res = MaximiseStockPurchase(arr, N);
    Console.WriteLine(res);
  }
}
 
// This code is contributed by Samim Hossain Mondal.

Javascript

<script>
    // JavaScript code to implement the approach
 
    // Function to calculate the maximum value
    const MaximiseStockPurchase = (nums, n) => {
        let maxi = 0;
        for (let i = 0; i < n; i++)
            maxi = Math.max(maxi, nums[i]);
 
        let freq = new Array(maxi + 1).fill(0);
        let dp = new Array(maxi + 1).fill(0);
 
        for (let i in nums)
            freq[nums[i]]++;
        dp[1] = freq[1];
 
        // Loop to calculate dp[] array
        // till max element of array
        for (let i = 2; i <= maxi; i++)
            dp[i] = Math.max(dp[i - 2] + i * freq[i],
                dp[i - 1]);
 
        return dp[maxi];
    }
 
    // Driver code
    let arr = [2, 2, 3, 4, 3, 3];
    let N = arr.length;
 
    let res = MaximiseStockPurchase(arr, N);
    document.write(res);
 
// This code is contributed by rakeshsahni
 
</script>
Producción

9

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

Enfoque alternativo: en el enfoque anterior, el espacio de la array dp[] se puede optimizar de la siguiente manera:

Como se ve en la observación, solo necesitamos el valor de dp[i-1] y dp[i-2] para calcular el valor de dp[i]. Entonces, en lugar de usar la array dp[], use dos variables para almacenar el valor de los dos pasos anteriores.

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

C++

// C++ code to implement the approach
 
#include <bits/stdc++.h>
using namespace std;
 
// Function to calculate the maximum sum
int MaximiseStockPurchase(vector<int>& nums,
                          int n)
{
    int maxNum = INT_MIN;
    for (auto i : nums)
        maxNum = max(maxNum, i);
    vector<int> freq(maxNum + 1, 0);
    for (auto i : nums)
        freq[i]++;
 
    int curPoints = freq[1], prevPoints = 0;
 
    // Loop to calculate the sum
    for (int i = 2; i <= maxNum; i++) {
        int tmp = curPoints;
        curPoints = max(prevPoints + i * freq[i],
                        curPoints);
        prevPoints = tmp;
    }
    return curPoints;
}
 
// Driver code
int main()
{
    vector<int> arr{ 2, 2, 3, 4, 3, 3 };
    int N = arr.size();
 
    int res = MaximiseStockPurchase(arr, N);
    cout << res;
    return 0;
}

Java

// Java implementation of above approach
 
import java.io.*;
import java.util.*;
 
class GFG {
 
  // Function to calculate the maximum sum
  static int MaximiseStockPurchase(int[] nums, int n)
  {
    int maxNum = Integer.MIN_VALUE;
    for(int i : nums) maxNum = Math.max(maxNum, i);
 
    int[] freq = new int[maxNum + 1];
    for (int x = 0; x < maxNum; x++) {
      freq[x] = 0;
    }
 
    for(int i : nums) freq[i]++;
 
    int curPoints = freq[1], prevPoints = 0;
 
    // Loop to calculate the sum
    for (int i = 2; i <= maxNum; i++) {
      int tmp = curPoints;
      curPoints = Math.max(prevPoints + i * freq[i],
                           curPoints);
      prevPoints = tmp;
    }
    return curPoints;
  }
 
 
  // Driver Code
  public static void main(String[] args)
  {
    int[] arr = { 2, 2, 3, 4, 3, 3 };
    int N = arr.length;
 
    int res = MaximiseStockPurchase(arr, N);
    System.out.print(res);
  }
}
 
// This code is contributed by code_hunt.

Python3

# Python code to implement the approach
 
# Function to calculate the maximum sum
import sys
 
def MaximiseStockPurchase(nums,n):
 
    maxNum = -sys.maxsize -1
    for i in nums:
        maxNum = max(maxNum, i)
    freq = [0 for i in range(maxNum+1)]
    for i in nums:
        freq[i] += 1
 
    curPoints,prevPoints = freq[1],0
 
    # Loop to calculate the sum
    for i in range(2,maxNum+1):
        tmp = curPoints
        curPoints = max(prevPoints + i * freq[i],curPoints)
        prevPoints = tmp
 
    return curPoints
 
# Driver code
arr = [ 2, 2, 3, 4, 3, 3 ]
N = len(arr)
 
res = MaximiseStockPurchase(arr, N)
print(res)
 
# This code is contributed by shinjanpatra

C#

// C# code to implement the approach
 
using System;
class GFG {
 
    // Function to calculate the maximum sum
    static int MaximiseStockPurchase(int[] nums, int n)
    {
        int maxNum = Int32.MinValue;
        foreach(int i in nums) maxNum = Math.Max(maxNum, i);
 
        int[] freq = new int[maxNum + 1];
        for (int x = 0; x < maxNum; x++) {
            freq[x] = 0;
        }
 
        foreach(int i in nums) freq[i]++;
 
        int curPoints = freq[1], prevPoints = 0;
 
        // Loop to calculate the sum
        for (int i = 2; i <= maxNum; i++) {
            int tmp = curPoints;
            curPoints = Math.Max(prevPoints + i * freq[i],
                                 curPoints);
            prevPoints = tmp;
        }
        return curPoints;
    }
 
    // Driver code
    public static void Main()
    {
        int[] arr = { 2, 2, 3, 4, 3, 3 };
        int N = arr.Length;
 
        int res = MaximiseStockPurchase(arr, N);
        Console.Write(res);
    }
}
 
// This code is contributed by Samim Hossain Mondal.

Javascript

<script>
 
// JavaScript code to implement the approach
 
// Function to calculate the maximum sum
function MaximiseStockPurchase(nums,n)
{
    let maxNum = Number.MIN_VALUE;
    for (let i of nums)
        maxNum = Math.max(maxNum, i);
    let freq = new Array(maxNum + 1).fill(0);
    for (let i of nums)
        freq[i]++;
 
    let curPoints = freq[1], prevPoints = 0;
 
    // Loop to calculate the sum
    for (let i = 2; i <= maxNum; i++) {
        let tmp = curPoints;
        curPoints = Math.max(prevPoints + i * freq[i],
                        curPoints);
        prevPoints = tmp;
    }
    return curPoints;
}
 
// Driver code
let arr = [ 2, 2, 3, 4, 3, 3 ];
let N = arr.length;
 
let res = MaximiseStockPurchase(arr, N);
document.write(res);
 
// This code is contributed by shinjanpatra
 
</script>
Producción

9

Complejidad temporal : O(N + M) donde M es el elemento máximo del arreglo 
Espacio auxiliar: O(M).

Publicación traducida automáticamente

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