#practiceLinkDiv { display : aucun !important; }Étant donné un tableau d'entiers et un nombre k. On peut associer deux nombres du tableau si la différence entre eux est strictement inférieure à k. La tâche consiste à trouver la somme maximale possible de paires disjointes. La somme des P paires est la somme de tous les nombres 2P de paires.
Exemples :
Pratique recommandée Paires avec différence spécifique Essayez-le !Saisir : arr[] = {3 5 10 15 17 12 9} K = 4
Sortir : 62
Explication:
Alors les paires disjointes avec une différence inférieure à K sont (3 5) (10 12) (15 17)
La somme maximale que nous pouvons obtenir est donc 3 + 5 + 12 + 10 + 15 + 17 = 62
Notez qu'une autre façon de former des paires disjointes est (3 5) (9 12) (15 17), mais cet appariement produit une somme moindre.
Saisir : arr[] = {5 15 10 300}k = 12
Sortir : 25
Approche: Nous trions d’abord le tableau donné par ordre croissant. Une fois le tableau trié, nous parcourons le tableau. Pour chaque élément, nous essayons d’abord de le coupler avec son élément précédent. Pourquoi préférons-nous l’élément précédent ? Soit arr[i] peut être associé à arr[i-1] et arr[i-2] (c'est-à-dire arr[i] – arr[i-1]< K and arr[i]-arr[i-2] < K). Since the array is sorted value of arr[i-1] would be more than arr[i-2]. Also we need to pair with difference less than k it means if arr[i-2] can be paired then arr[i-1] can also be paired in a sorted array.
En observant maintenant les faits ci-dessus, nous pouvons formuler notre solution de programmation dynamique comme ci-dessous
Soit dp[i] la somme maximale de paires disjointes que nous pouvons obtenir en utilisant les i premiers éléments du tableau. Supposons que nous soyons actuellement à la ième position, alors il y a deux possibilités pour nous.
Pair up i with (i-1)th element i.e. dp[i] = dp[i-2] + arr[i] + arr[i-1] Don't pair up i.e. dp[i] = dp[i-1]
L'itération ci-dessus prend un temps O(N) et le tri du tableau prendra un temps O(N log N), donc la complexité temporelle totale de la solution sera O(N log N)
Mise en œuvre:
C++// C++ program to find maximum pair sum whose // difference is less than K #include using namespace std; // method to return maximum sum we can get by // finding less than K difference pair int maxSumPairWithDifferenceLessThanK(int arr[] int N int K) { // Sort input array in ascending order. sort(arr arr+N); // dp[i] denotes the maximum disjoint pair sum // we can achieve using first i elements int dp[N]; // if no element then dp value will be 0 dp[0] = 0; for (int i = 1; i < N; i++) { // first give previous value to dp[i] i.e. // no pairing with (i-1)th element dp[i] = dp[i-1]; // if current and previous element can form a pair if (arr[i] - arr[i-1] < K) { // update dp[i] by choosing maximum between // pairing and not pairing if (i >= 2) dp[i] = max(dp[i] dp[i-2] + arr[i] + arr[i-1]); else dp[i] = max(dp[i] arr[i] + arr[i-1]); } } // last index will have the result return dp[N - 1]; } // Driver code to test above methods int main() { int arr[] = {3 5 10 15 17 12 9}; int N = sizeof(arr)/sizeof(int); int K = 4; cout << maxSumPairWithDifferenceLessThanK(arr N K); return 0; }
Java // Java program to find maximum pair sum whose // difference is less than K import java.io.*; import java.util.*; class GFG { // method to return maximum sum we can get by // finding less than K difference pair static int maxSumPairWithDifferenceLessThanK(int arr[] int N int K) { // Sort input array in ascending order. Arrays.sort(arr); // dp[i] denotes the maximum disjoint pair sum // we can achieve using first i elements int dp[] = new int[N]; // if no element then dp value will be 0 dp[0] = 0; for (int i = 1; i < N; i++) { // first give previous value to dp[i] i.e. // no pairing with (i-1)th element dp[i] = dp[i-1]; // if current and previous element can form a pair if (arr[i] - arr[i-1] < K) { // update dp[i] by choosing maximum between // pairing and not pairing if (i >= 2) dp[i] = Math.max(dp[i] dp[i-2] + arr[i] + arr[i-1]); else dp[i] = Math.max(dp[i] arr[i] + arr[i-1]); } } // last index will have the result return dp[N - 1]; } // Driver code to test above methods public static void main (String[] args) { int arr[] = {3 5 10 15 17 12 9}; int N = arr.length; int K = 4; System.out.println ( maxSumPairWithDifferenceLessThanK( arr N K)); } } //This code is contributed by vt_m.
Python3 # Python3 program to find maximum pair # sum whose difference is less than K # method to return maximum sum we can # get by get by finding less than K # difference pair def maxSumPairWithDifferenceLessThanK(arr N K): # Sort input array in ascending order. arr.sort() # dp[i] denotes the maximum disjoint # pair sum we can achieve using first # i elements dp = [0] * N # if no element then dp value will be 0 dp[0] = 0 for i in range(1 N): # first give previous value to # dp[i] i.e. no pairing with # (i-1)th element dp[i] = dp[i-1] # if current and previous element # can form a pair if (arr[i] - arr[i-1] < K): # update dp[i] by choosing # maximum between pairing # and not pairing if (i >= 2): dp[i] = max(dp[i] dp[i-2] + arr[i] + arr[i-1]); else: dp[i] = max(dp[i] arr[i] + arr[i-1]); # last index will have the result return dp[N - 1] # Driver code to test above methods arr = [3 5 10 15 17 12 9] N = len(arr) K = 4 print(maxSumPairWithDifferenceLessThanK(arr N K)) # This code is contributed by Smitha Dinesh Semwal
C# // C# program to find maximum pair sum whose // difference is less than K using System; class GFG { // method to return maximum sum we can get by // finding less than K difference pair static int maxSumPairWithDifferenceLessThanK(int []arr int N int K) { // Sort input array in ascending order. Array.Sort(arr); // dp[i] denotes the maximum disjoint pair sum // we can achieve using first i elements int []dp = new int[N]; // if no element then dp value will be 0 dp[0] = 0; for (int i = 1; i < N; i++) { // first give previous value to dp[i] i.e. // no pairing with (i-1)th element dp[i] = dp[i-1]; // if current and previous element can form // a pair if (arr[i] - arr[i-1] < K) { // update dp[i] by choosing maximum // between pairing and not pairing if (i >= 2) dp[i] = Math.Max(dp[i] dp[i-2] + arr[i] + arr[i-1]); else dp[i] = Math.Max(dp[i] arr[i] + arr[i-1]); } } // last index will have the result return dp[N - 1]; } // Driver code to test above methods public static void Main () { int []arr = {3 5 10 15 17 12 9}; int N = arr.Length; int K = 4; Console.WriteLine( maxSumPairWithDifferenceLessThanK(arr N K)); } } // This code is contributed by anuj_67.
PHP // Php program to find maximum pair sum whose // difference is less than K // method to return maximum sum we can get by // finding less than K difference pair function maxSumPairWithDifferenceLessThanK($arr $N $K) { // Sort input array in ascending order. sort($arr) ; // dp[i] denotes the maximum disjoint pair sum // we can achieve using first i elements $dp = array() ; // if no element then dp value will be 0 $dp[0] = 0; for ($i = 1; $i < $N; $i++) { // first give previous value to dp[i] i.e. // no pairing with (i-1)th element $dp[$i] = $dp[$i-1]; // if current and previous element can form a pair if ($arr[$i] - $arr[$i-1] < $K) { // update dp[i] by choosing maximum between // pairing and not pairing if ($i >= 2) $dp[$i] = max($dp[$i] $dp[$i-2] + $arr[$i] + $arr[$i-1]); else $dp[$i] = max($dp[$i] $arr[$i] + $arr[$i-1]); } } // last index will have the result return $dp[$N - 1]; } // Driver code $arr = array(3 5 10 15 17 12 9); $N = sizeof($arr) ; $K = 4; echo maxSumPairWithDifferenceLessThanK($arr $N $K); // This code is contributed by Ryuga ?> JavaScript <script> // Javascript program to find maximum pair sum whose // difference is less than K // method to return maximum sum we can get by // finding less than K difference pair function maxSumPairWithDifferenceLessThanK(arr N K) { // Sort input array in ascending order. arr.sort(); // dp[i] denotes the maximum disjoint pair sum // we can achieve using first i elements let dp = []; // if no element then dp value will be 0 dp[0] = 0; for (let i = 1; i < N; i++) { // first give previous value to dp[i] i.e. // no pairing with (i-1)th element dp[i] = dp[i-1]; // if current and previous element can form a pair if (arr[i] - arr[i-1] < K) { // update dp[i] by choosing maximum between // pairing and not pairing if (i >= 2) dp[i] = Math.max(dp[i] dp[i-2] + arr[i] + arr[i-1]); else dp[i] = Math.max(dp[i] arr[i] + arr[i-1]); } } // last index will have the result return dp[N - 1]; } // Driver code to test above methods let arr = [3 5 10 15 17 12 9]; let N = arr.length; let K = 4; document.write( maxSumPairWithDifferenceLessThanK( arr N K)); // This code is contributed by avijitmondal1998. </script>
Sortir
62
Complexité temporelle : O(N Log N)
Espace auxiliaire : O(N)
Une solution optimisée apportée par Amit Sane est donnée ci-dessous
Mise en œuvre:
C++// C++ program to find maximum pair sum whose // difference is less than K #include using namespace std; // Method to return maximum sum we can get by // finding less than K difference pairs int maxSumPair(int arr[] int N int k) { int maxSum = 0; // Sort elements to ensure every i and i-1 is closest // possible pair sort(arr arr + N); // To get maximum possible sum // iterate from largest to // smallest giving larger // numbers priority over smaller // numbers. for (int i = N - 1; i > 0; --i) { // Case I: Diff of arr[i] and arr[i-1] // is less than Kadd to maxSum // Case II: Diff between arr[i] and arr[i-1] is not // less than K move to next i since with // sorting we know arr[i]-arr[i-1] < // rr[i]-arr[i-2] and so on. if (arr[i] - arr[i - 1] < k) { // Assuming only positive numbers. maxSum += arr[i]; maxSum += arr[i - 1]; // When a match is found skip this pair --i; } } return maxSum; } // Driver code int main() { int arr[] = { 3 5 10 15 17 12 9 }; int N = sizeof(arr) / sizeof(int); int K = 4; cout << maxSumPair(arr N K); return 0; }
Java // Java program to find maximum pair sum whose // difference is less than K import java.io.*; import java.util.*; class GFG { // Method to return maximum sum we can get by // finding less than K difference pairs static int maxSumPairWithDifferenceLessThanK(int arr[] int N int k) { int maxSum = 0; // Sort elements to ensure every i and i-1 is // closest possible pair Arrays.sort(arr); // To get maximum possible sum // iterate from largest // to smallest giving larger // numbers priority over // smaller numbers. for (int i = N - 1; i > 0; --i) { // Case I: Diff of arr[i] and arr[i-1] is less // than K add to maxSum // Case II: Diff between arr[i] and arr[i-1] is // not less than K move to next i // since with sorting we know arr[i]-arr[i-1] < // arr[i]-arr[i-2] and so on. if (arr[i] - arr[i - 1] < k) { // Assuming only positive numbers. maxSum += arr[i]; maxSum += arr[i - 1]; // When a match is found skip this pair --i; } } return maxSum; } // Driver code public static void main(String[] args) { int arr[] = { 3 5 10 15 17 12 9 }; int N = arr.length; int K = 4; System.out.println( maxSumPairWithDifferenceLessThanK(arr N K)); } } // This code is contributed by vt_m.
Python3 # Python3 program to find maximum pair sum # whose difference is less than K # Method to return maximum sum we can # get by finding less than K difference # pairs def maxSumPairWithDifferenceLessThanK(arr N k): maxSum = 0 # Sort elements to ensure every i and # i-1 is closest possible pair arr.sort() # To get maximum possible sum iterate # from largest to smallest giving larger # numbers priority over smaller numbers. i = N - 1 while (i > 0): # Case I: Diff of arr[i] and arr[i-1] # is less than K add to maxSum # Case II: Diff between arr[i] and # arr[i-1] is not less than K # move to next i since with sorting # we know arr[i]-arr[i-1] < arr[i]-arr[i-2] # and so on. if (arr[i] - arr[i - 1] < k): # Assuming only positive numbers. maxSum += arr[i] maxSum += arr[i - 1] # When a match is found skip this pair i -= 1 i -= 1 return maxSum # Driver Code arr = [3 5 10 15 17 12 9] N = len(arr) K = 4 print(maxSumPairWithDifferenceLessThanK(arr N K)) # This code is contributed by mits
C# // C# program to find maximum pair sum whose // difference is less than K using System; class GFG { // Method to return maximum sum we can get by // finding less than K difference pairs static int maxSumPairWithDifferenceLessThanK(int []arr int N int k) { int maxSum = 0; // Sort elements to ensure // every i and i-1 is closest // possible pair Array.Sort(arr); // To get maximum possible sum // iterate from largest // to smallest giving larger // numbers priority over // smaller numbers. for (int i = N-1; i > 0; --i) { /* Case I: Diff of arr[i] and arr[i-1] is less than K add to maxSum Case II: Diff between arr[i] and arr[i-1] is not less than K move to next i since with sorting we know arr[i]-arr[i-1] < arr[i]-arr[i-2] and so on.*/ if (arr[i] - arr[i-1] < k) { // Assuming only positive numbers. maxSum += arr[i]; maxSum += arr[i - 1]; // When a match is found // skip this pair --i; } } return maxSum; } // Driver Code public static void Main () { int []arr = {3 5 10 15 17 12 9}; int N = arr.Length; int K = 4; Console.Write( maxSumPairWithDifferenceLessThanK(arr N K)); } } // This code is contributed by nitin mittal.
PHP // PHP program to find maximum pair sum // whose difference is less than K // Method to return maximum sum we can // get by finding less than K difference // pairs function maxSumPairWithDifferenceLessThanK($arr $N $k) { $maxSum = 0; // Sort elements to ensure every i and // i-1 is closest possible pair sort($arr); // To get maximum possible sum iterate // from largest to smallest giving larger // numbers priority over smaller numbers. for ($i = $N - 1; $i > 0; --$i) { // Case I: Diff of arr[i] and arr[i-1] // is less than K add to maxSum // Case II: Diff between arr[i] and // arr[i-1] is not less than K // move to next i since with sorting // we know arr[i]-arr[i-1] < arr[i]-arr[i-2] // and so on. if ($arr[$i] - $arr[$i - 1] < $k) { // Assuming only positive numbers. $maxSum += $arr[$i]; $maxSum += $arr[$i - 1]; // When a match is found skip this pair --$i; } } return $maxSum; } // Driver Code $arr = array(3 5 10 15 17 12 9); $N = sizeof($arr); $K = 4; echo maxSumPairWithDifferenceLessThanK($arr $N $K); // This code is contributed // by Sach_Code ?> JavaScript <script> // Javascript program to find // maximum pair sum whose // difference is less than K // Method to return maximum sum we can get by // finding less than K difference pairs function maxSumPairWithDifferenceLessThanK(arr N k) { var maxSum = 0; // Sort elements to ensure every i and i-1 is // closest possible pair arr.sort((ab)=>a-b); // To get maximum possible sum // iterate from largest // to smallest giving larger // numbers priority over // smaller numbers. for (i = N - 1; i > 0; --i) { // Case I: Diff of arr[i] and arr[i-1] is less // than K add to maxSum // Case II: Diff between arr[i] and arr[i-1] is // not less than K move to next i // since with sorting we know arr[i]-arr[i-1] < // arr[i]-arr[i-2] and so on. if (arr[i] - arr[i - 1] < k) { // Assuming only positive numbers. maxSum += arr[i]; maxSum += arr[i - 1]; // When a match is found skip this pair --i; } } return maxSum; } // Driver code var arr = [ 3 5 10 15 17 12 9 ]; var N = arr.length; var K = 4; document.write(maxSumPairWithDifferenceLessThanK(arr N K)); // This code is contributed by 29AjayKumar </script>
Sortir
62
Complexité temporelle : O(N Log N)
Espace auxiliaire : O(1)