Advertisement
Riz1Ahmed

Bitmask DP (LOJ 1011 - Marriage Ceremonies)

Jan 30th, 2020
179
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.02 KB | None | 0 0
  1. /** Bitmask DP (LOJ 1011 - Marriage Ceremonies)
  2. Given boys & Girls Chosen priority
  3. (as ith boy & jth girl priority is prio[i][j]).
  4. Match the Boy and Girl such that Prority is Maximum.
  5. Must onr boy choise only one girl.
  6. 1 2 3         1 5
  7. 6 5 4         2 1
  8. 8 1 2         Ans=7
  9. Ans=16                                     */
  10. #include<bits/stdc++.h>
  11. using namespace std;
  12. int prio[20][20],n, dp[17][1<<17];
  13. bool maried(int mask,int p){return mask&(1<<p);}
  14. int Set(int mask,int p){    return mask|(1<<p);}
  15. int best(int boy,int girl){
  16.     if (boy==n) return 0;
  17.     int &res=dp[boy][girl];
  18.     if (res) return res;
  19.     for (int i=0; i<n; i++)
  20.         if (!maried(girl,i))
  21.             res=max(res, best(boy+1,Set(girl,i)) + prio[boy][i]);
  22.     return res;
  23. }
  24. int main(){
  25.     int cs=1;
  26.     scanf("%*d");
  27.     while(~scanf("%d",&n)){
  28.         memset(dp,0,sizeof dp);
  29.         for (int i=0; i<n; i++) for (int j=0; j<n; j++)
  30.             scanf("%d",&prio[i][j]);
  31.         printf("Case %d: %d\n",cs++,best(0,0));
  32.     }
  33.     return 0;
  34. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement