Advertisement
Fastrail08

Maximum number after atmost k swaps

May 11th, 2025 (edited)
159
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.13 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. /* IMPORTANT
  5.     here memoization can be done by observing the variables that are changing:
  6.     Memo(string, k) (for a particular number string, how many swaps available)
  7.     unordered_map<string, unordered_set<int> > Memo
  8.     memo will be able to store what all 'k' have been calculated for the string.
  9.     eg - "1234" k = 2, "1234" k = 1 will be different states, as both params are variable.
  10.     we can also store the return value ... FOR DP purpose
  11.     unordered_map<pair<string, int>, long long int> dp
  12.     dp will be able to store what is the max number that can be formed if we have the state (number, k)
  13. */
  14.  
  15.  
  16. void swap(string &number, int l, int r){
  17.     char temp = number[l];
  18.     number[l] = number[r];
  19.     number[r] = temp;
  20. }
  21.  
  22. void maxNumberAfterKswaps(int level, int k, string ans, string &number, long long &_max){
  23.     //base case
  24.     // largest number after ATMOST k swaps (not necessary to do exactly k, but not more than k), so no base condition such as (level >= number.size() && k == 0)
  25.     if(level >= number.size()){
  26.         if(!ans.empty()){
  27.             long long int ansToLL = stoll(ans);
  28.             if(ansToLL > _max){
  29.                 _max = ansToLL;
  30.             }
  31.         }
  32.         return;
  33.     }
  34.    
  35.     //every level has 2 options, either swap with any number available, or don't swap
  36.    
  37.     //swap if swap is available i.e. k > 0
  38.     //this number got swapped, so available for further use in that branch
  39.     if(k > 0){
  40.         for(int i = level + 1; i < number.size(); i++){
  41.             if(number[level] != number[i]){
  42.                 swap(number, level, i);
  43.                 maxNumberAfterKswaps(level + 1, k - 1, ans + number[level], number, _max);
  44.                 swap(number, level, i);
  45.             }
  46.         }
  47.     }
  48.    
  49.     // don't swap
  50.     maxNumberAfterKswaps(level + 1, k, ans + number[level], number, _max);
  51.    
  52. }
  53.  
  54. int main() {
  55.     // your code goes here
  56.     string number;
  57.     int k;
  58.     cin >> number;
  59.     cin >> k;
  60.     long long int _max = LLONG_MIN;
  61.     maxNumberAfterKswaps(0, k, "", number, _max);
  62.     cout << _max << '\n';
  63. }
  64.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement