Dado N número de sobres, como par {W, H} , donde W es el ancho y H la altura. Un sobre puede caber en otro si y solo si tanto el ancho como el alto de un sobre son mayores que el ancho y el alto del otro sobre. Encuentre el número máximo de sobres que se pueden poner dentro de otro sobre y así sucesivamente. No se permite la rotación del sobre.
Ejemplos:
Entrada: sobre[] = {{4, 3}, {5, 3}, {5, 6}, {1, 2}}
Salida: 3
Explicación:
El número máximo de sobres que se pueden poner en otro sobre
es 3 (
{1, 2}, {4, 3}, {5, 6})Entrada: envolvente[] = {{3, 6}, {5, 4}, {4, 8}, {6, 9}, {10, 7}, {12, 12}}
Salida: 4
Explicación:
El máximo número de sobres que se pueden poner en otro sobre es 4.
({3, 6}, {4, 8}, {6, 9}, {12, 12})
Enfoque ingenuo: este problema es similar al problema de la subsecuencia creciente más larga de la programación dinámica . La idea es clasificar los sobres en orden no decreciente y para cada sobre comprobar el número de sobres que se pueden poner dentro de ese sobre. Siga los pasos a continuación para resolver el problema:
- Ordene la array en el orden no decreciente de ancho y alto.
- Inicialice una array dp[] , donde dp[i] almacena la cantidad de sobres que se pueden colocar dentro con sobre[i] como el sobre más grande.
- Para cada sobre[i], recorra los sobres más pequeños que él mismo y verifique si el ancho y la altura del sobre más pequeño son estrictamente menores que los del sobre[i]. Si es menor, el sobre más pequeño puede colocarse dentro del sobre[i].
- El máximo de la array dp[] da el número máximo de sobres que se pueden poner uno dentro de otro.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function that returns the maximum // number of envelopes that can be // inserted into another envelopes int maxEnvelopes(vector<vector<int> > envelopes) { // Number of envelopes int N = envelopes.size(); if (N == 0) return N; // Sort the envelopes in // non-decreasing order sort(envelopes.begin(), envelopes.end()); // Initialize dp[] array int dp[N]; // To store the result int max_envelope = 1; dp[0] = 1; // Loop through the array for (int i = 1; i < N; ++i) { dp[i] = 1; // Find envelopes count for // each envelope for (int j = 0; j < i; ++j) { if (envelopes[i][0] > envelopes[j][0] && envelopes[i][1] > envelopes[j][1] && dp[i] < dp[j] + 1) dp[i] = dp[j] + 1; } // Store maximum envelopes count max_envelope = max(max_envelope, dp[i]); } // Return the result return max_envelope; } // Driver Code int main() { // Given the envelopes vector<vector<int> > envelopes = { { 4, 3 }, { 5, 3 }, { 5, 6 }, { 1, 2 } }; // Function Call cout << maxEnvelopes(envelopes); return 0; }
Java
// Java program for the above approach import java.util.*; import java.lang.*; class GFG{ // Function that returns the maximum // number of envelopes that can be // inserted into another envelopes static int maxEnvelopes(int[][] envelopes) { // Number of envelopes int N = envelopes.length; if (N == 0) return N; // Sort the envelopes in // non-decreasing order Arrays.sort(envelopes, (a, b) -> (a[0] != b[0]) ? a[0] - b[0] : a[1] - b[1]); // Initialize dp[] array int[] dp = new int[N]; // To store the result int max_envelope = 1; dp[0] = 1; // Loop through the array for(int i = 1; i < N; ++i) { dp[i] = 1; // Find envelopes count for // each envelope for(int j = 0; j < i; ++j) { if (envelopes[i][0] > envelopes[j][0] && envelopes[i][1] > envelopes[j][1] && dp[i] < dp[j] + 1) dp[i] = dp[j] + 1; } // Store maximum envelopes count max_envelope = Math.max(max_envelope, dp[i]); } // Return the result return max_envelope; } // Driver Code public static void main (String[] args) { // Given the envelopes int[][] envelopes = { { 4, 3 }, { 5, 3 }, { 5, 6 }, { 1, 2 } }; // Function call System.out.println(maxEnvelopes(envelopes)); } } // This code is contributed by offbeat
Python3
# Python3 program for the above approach # Function that returns the maximum # number of envelopes that can be # inserted into another envelopes def maxEnvelopes(envelopes): # Number of envelopes N = len(envelopes) if (N == 0): return N # Sort the envelopes in # non-decreasing order envelopes = sorted(envelopes) # Initialize dp[] array dp = [0] * N # To store the result max_envelope = 1 dp[0] = 1 # Loop through the array for i in range(1, N): dp[i] = 1 # Find envelopes count for # each envelope for j in range(i): if (envelopes[i][0] > envelopes[j][0] and envelopes[i][1] > envelopes[j][1] and dp[i] < dp[j] + 1): dp[i] = dp[j] + 1 # Store maximum envelopes count max_envelope = max(max_envelope, dp[i]) # Return the result return max_envelope # Driver Code if __name__ == '__main__': # Given the envelopes envelopes = [ [ 4, 3 ], [ 5, 3 ], [ 5, 6 ], [ 1, 2 ] ] # Function Call print(maxEnvelopes(envelopes)) # This code is contributed by Mohit Kumar
C#
// C# program to implement above approach using System; using System.Collections; using System.Collections.Generic; class GFG { // Function that returns the maximum // number of envelopes that can be // inserted into another envelopes static int maxEnvelopes(int[][] envelopes) { // Number of envelopes int N = envelopes.Length; if (N == 0){ return N; } // Sort the envelopes in // non-decreasing order Array.Sort(envelopes, new comp()); // Initialize dp[] array int[] dp = new int[N]; // To store the result int max_envelope = 1; dp[0] = 1; // Loop through the array for(int i = 1 ; i < N ; ++i) { dp[i] = 1; // Find envelopes count for // each envelope for(int j = 0 ; j < i ; ++j) { if (envelopes[i][0] > envelopes[j][0] && envelopes[i][1] > envelopes[j][1] && dp[i] < dp[j] + 1){ dp[i] = dp[j] + 1; } } // Store maximum envelopes count max_envelope = Math.Max(max_envelope, dp[i]); } // Return the result return max_envelope; } // Driver code public static void Main(string[] args){ // Given the envelopes int[][] envelopes = new int[][]{ new int[]{ 4, 3 }, new int[]{ 5, 3 }, new int[]{ 5, 6 }, new int[]{ 1, 2 } }; // Function call Console.WriteLine(maxEnvelopes(envelopes)); } } class comp : IComparer<int[]>{ public int Compare(int[] a, int[] b) { if(a[0] != b[0]) return a[0] - b[0]; return a[1] - b[1]; } } // This code is contributed by entertain2022.
Javascript
<script> // JavaScript program for the above approach // Function that returns the maximum // number of envelopes that can be // inserted into another envelopes function maxEnvelopes(envelopes) { // Number of envelopes var N = envelopes.length; if (N == 0) return N; // Sort the envelopes in // non-decreasing order envelopes.sort(); // Initialize dp[] array var dp = Array(N); // To store the result var max_envelope = 1; dp[0] = 1; // Loop through the array for (var i = 1; i < N; ++i) { dp[i] = 1; // Find envelopes count for // each envelope for (var j = 0; j < i; ++j) { if (envelopes[i][0] > envelopes[j][0] && envelopes[i][1] > envelopes[j][1] && dp[i] < dp[j] + 1) dp[i] = dp[j] + 1; } // Store maximum envelopes count max_envelope = Math.max(max_envelope, dp[i]); } // Return the result return max_envelope; } // Driver Code // Given the envelopes var envelopes = [ [ 4, 3 ], [ 5, 3 ], [ 5, 6 ], [ 1, 2 ] ]; // Function Call document.write( maxEnvelopes(envelopes)); </script>
3
Tiempo Complejidad: O(N 2 )
Espacio Auxiliar: O(N)
Enfoque eficiente: para optimizar el enfoque ingenuo, la idea es utilizar el concepto de búsqueda binaria y la subsecuencia creciente más larga . Clasificar los sobres en orden creciente de ancho y en orden decreciente de altura si el ancho es el mismo, reduce el problema a encontrar la secuencia creciente más larga de altura del sobre. Este enfoque funciona ya que el ancho ya está clasificado en orden creciente y solo la secuencia máxima creciente de altura es suficiente para encontrar el número máximo de sobres. La forma eficiente de encontrar la secuencia creciente más larga en el enfoque N × log (N) se analiza en este artículo.
A continuación se muestra la implementación del enfoque anterior:
C++
// C++ program for the above approach #include <bits/stdc++.h> using namespace std; // Function that returns the maximum // number of envelopes that can be // inserted into another envelopes int maxEnvelopes(vector<vector<int> >& envelopes) { // Number of envelopes int N = envelopes.size(); if (N == 0) return N; // Sort the envelopes in increasing // order of width and decreasing order // of height is width is same sort(envelopes.begin(), envelopes.end(), [](vector<int>& a, vector<int>& b) { return a[0] < b[0] or (a[0] == b[0] and a[1] > b[1]); }); // To store the longest increasing // sequence of height vector<int> dp; // Finding LIS of the heights // of the envelopes for (int i = 0; i < N; ++i) { auto iter = lower_bound(dp.begin(), dp.end(), envelopes[i][1]); if (iter == dp.end()) dp.push_back(envelopes[i][1]); else if (envelopes[i][1] < *iter) *iter = envelopes[i][1]; } // Return the result return dp.size(); } // Driver Code int main() { // Given the envelopes vector<vector<int> > envelopes = { { 4, 3 }, { 5, 3 }, { 5, 6 }, { 1, 2 } }; // Function Call cout << maxEnvelopes(envelopes); return 0; }
3
Complejidad de tiempo: O( N*log(N) )
Espacio auxiliar: O(N)
Publicación traducida automáticamente
Artículo escrito por d_hacked_scripter y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA