Dada una array de enteros ‘arr’ de longitud N y un entero ‘k’, seleccione algunos subarreglos que no se superpongan de modo que cada subarreglo tenga una longitud máxima de ‘k’, no haya dos subarreglos adyacentes y la suma de todos los los elementos de los subconjuntos seleccionados son máximos.
Ejemplos:
Input : arr[] = {-1, 2, -3, 4, 5}, k = 2 Output : 11 Sub-arrays that maximizes sum will be {{2}, {4, 5}}. Thus, the answer will be 2+4+5 = 11. Input :arr[] = {1, 1, 1, 1, 1}, k = 1 Output : 3
Enfoque ingenuo : una forma simple es generar todos los subconjuntos posibles de elementos que satisfagan las condiciones anteriores de forma recursiva y encontrar el subconjunto con la suma máxima.
Complejidad de tiempo : O(2 N )
Enfoque eficiente: un mejor enfoque es usar programación dinámica .
Supongamos que estamos en un índice ‘i’.
Deje que dp[i] se defina como la suma máxima de elementos de todos los subconjuntos posibles del subconjunto {i, n-1} que satisfacen las condiciones anteriores.
Tendremos ‘K+1’ opciones posibles, es decir
- Rechaza ‘i’ y resuelve para ‘i+1’.
- Seleccione el subconjunto {i} y resuelva para ‘i+2’
- Seleccione el subconjunto {i, i+1} y resuelva para ‘i+3’
Así, la relación de recurrencia será:
dp[i] = max(dp[i+1], arr[i]+dp[i+2], arr[i]+arr[i+1]+dp[i+3], ...arr[i]+arr[i+1]+arr[i+2]...+arr[i+k-1] + dp[i+k+1])
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program to implement above approach #include <bits/stdc++.h> #define maxLen 10 using namespace std; // Variable to store states of dp int dp[maxLen]; // Variable to check if a given state has been solved bool visit[maxLen]; // Function to find the maximum sum subsequence // such that no two elements are adjacent int maxSum(int arr[], int i, int n, int k) { // Base case if (i >= n) return 0; // To check if a state has been solved if (visit[i]) return dp[i]; visit[i] = 1; // Variable to store // prefix sum for sub-array // {i, j} int tot = 0; dp[i] = maxSum(arr, i + 1, n, k); // Required recurrence relation for (int j = i; j < i + k and j < n; j++) { tot += arr[j]; dp[i] = max(dp[i], tot + maxSum(arr, j + 2, n, k)); } // Returning the value return dp[i]; } // Driver code int main() { // Input array int arr[] = { -1, 2, -3, 4, 5 }; int k = 2; int n = sizeof(arr) / sizeof(int); cout << maxSum(arr, 0, n, k); return 0; }
Java
// Java program to implement above approach import java.io.*; class GFG { static int maxLen = 10; // Variable to store states of dp static int dp[] = new int[maxLen]; // Variable to check // if a given state has been solved static boolean []visit = new boolean[maxLen]; // Function to find the maximum sum subsequence // such that no two elements are adjacent static int maxSum(int arr[], int i, int n, int k) { // Base case if (i >= n) return 0; // To check if a state has been solved if (visit[i]) return dp[i]; visit[i] = true; // Variable to store // prefix sum for sub-array // {i, j} int tot = 0; dp[i] = maxSum(arr, i + 1, n, k); // Required recurrence relation for (int j = i; j < (i + k) && (j < n); j++) { tot += arr[j]; dp[i] = Math.max(dp[i], tot + maxSum(arr, j + 2, n, k)); } // Returning the value return dp[i]; } // Driver code public static void main (String[] args) { // Input array int arr[] = { -1, 2, -3, 4, 5 }; int k = 2; int n = arr.length; System.out.println(maxSum(arr, 0, n, k)); } } // This code is contributed by ajit.
Python3
# Python3 program to implement above approach maxLen = 10 # Variable to store states of dp dp = [0]*maxLen; # Variable to check if a given state has been solved visit = [0]*maxLen; # Function to find the maximum sum subsequence # such that no two elements are adjacent def maxSum(arr, i, n, k) : # Base case if (i >= n) : return 0; # To check if a state has been solved if (visit[i]) : return dp[i]; visit[i] = 1; # Variable to store # prefix sum for sub-array # {i, j} tot = 0; dp[i] = maxSum(arr, i + 1, n, k); # Required recurrence relation j = i while (j < i + k and j < n) : tot += arr[j]; dp[i] = max(dp[i], tot + maxSum(arr, j + 2, n, k)); j += 1 # Returning the value return dp[i]; # Driver code if __name__ == "__main__" : # Input array arr = [ -1, 2, -3, 4, 5 ]; k = 2; n = len(arr); print(maxSum(arr, 0, n, k)); # This code is contributed by AnkitRai01
C#
// C# program to implement above approach using System; class GFG { static int maxLen = 10; // Variable to store states of dp static int []dp = new int[maxLen]; // Variable to check // if a given state has been solved static bool []visit = new bool[maxLen]; // Function to find the maximum sum subsequence // such that no two elements are adjacent static int maxSum(int []arr, int i, int n, int k) { // Base case if (i >= n) return 0; // To check if a state has been solved if (visit[i]) return dp[i]; visit[i] = true; // Variable to store // prefix sum for sub-array // {i, j} int tot = 0; dp[i] = maxSum(arr, i + 1, n, k); // Required recurrence relation for (int j = i; j < (i + k) && (j < n); j++) { tot += arr[j]; dp[i] = Math.Max(dp[i], tot + maxSum(arr, j + 2, n, k)); } // Returning the value return dp[i]; } // Driver code static public void Main () { // Input array int []arr = { -1, 2, -3, 4, 5 }; int k = 2; int n = arr.Length; Console.WriteLine (maxSum(arr, 0, n, k)); } } // This code is contributed by ajit.
Javascript
<script> // Javascript program to implement above approach let maxLen = 10; // Variable to store states of dp let dp = new Array(maxLen); // Variable to check // if a given state has been solved let visit = new Array(maxLen); // Function to find the maximum sum subsequence // such that no two elements are adjacent function maxSum(arr, i, n, k) { // Base case if (i >= n) return 0; // To check if a state has been solved if (visit[i]) return dp[i]; visit[i] = true; // Variable to store // prefix sum for sub-array // {i, j} let tot = 0; dp[i] = maxSum(arr, i + 1, n, k); // Required recurrence relation for (let j = i; j < (i + k) && (j < n); j++) { tot += arr[j]; dp[i] = Math.max(dp[i], tot + maxSum(arr, j + 2, n, k)); } // Returning the value return dp[i]; } // Input array let arr = [ -1, 2, -3, 4, 5 ]; let k = 2; let n = arr.length; document.write(maxSum(arr, 0, n, k)); </script>
11
Complejidad de tiempo: O(n*k)
Publicación traducida automáticamente
Artículo escrito por DivyanshuShekhar1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA