Maximal summa av par med specifik skillnad

Maximal summa av par med specifik skillnad
Prova det på GfG Practice #practiceLinkDiv { display: ingen !viktigt; }

Givet en matris med heltal och ett tal k. Vi kan para ihop två nummer i matrisen om skillnaden mellan dem är strikt mindre än k. Uppgiften är att hitta den maximala möjliga summan av disjunkta par. Summan av P-par är summan av alla 2P-antal av par.

Exempel:

Inmatning  : arr[] = {3 5 10 15 17 12 9} K = 4
Utgång: 62
Förklaring:
Då är osammanhängande par med skillnad mindre än K (3 5) (10 12) (15 17)  
Så den maximala summan vi kan få är 3 + 5 + 12 + 10 + 15 + 17 = 62
Observera att ett alternativt sätt att bilda disjunkta par är (3 5) (9 12) (15 17) men denna parning ger mindre summa.



Inmatning  : arr[] = {5 15 10 300} k = 12
Utgång: 25

Rekommenderad praxis Par med specifik skillnad Prova det!

Närma sig: Först sorterar vi den givna matrisen i ökande ordning. När arrayen är sorterad passerar vi arrayen. För varje element försöker vi först para ihop det med dess tidigare element. Varför föredrar vi tidigare element? Låt arr[i] kan paras ihop med arr[i-1] och arr[i-2] (dvs. 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. 

När vi nu observerar ovanstående fakta kan vi formulera vår dynamiska programmeringslösning enligt nedan 

Låt dp[i] betecknar den maximala disjunkta parsumman som vi kan uppnå genom att använda första i-elementen i arrayen. Anta att vi för närvarande är på i'th position så finns det två möjligheter för oss. 

 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]  

Ovan iteration tar O(N) tid och sortering av array kommer att ta O(N log N) tid så den totala tidskomplexiteten för lösningen blir O(N log N) 

Genomförande:

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>   

Produktion
62 

Tidskomplexitet: O(N Log N) 
Hjälputrymme: O(N)

En optimerad lösning med bidrag från Amit Sane ges nedan 

Genomförande:

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  ((  a    b  )=>  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>   

Produktion
62 

Tidskomplexitet: O(N Log N) 
Hjälputrymme: O(1)

 


Top Artiklar

Kategori

Intressanta Artiklar