shamiul93

1011 - Marriage Ceremonies

Mar 20th, 2018
128
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.28 KB | None | 0 0
  1. /*
  2. @author - Rumman BUET CSE'15
  3. Problem - 1011 - Marriage Ceremonies
  4. Idea - Bitmask DP, Rock climbing.
  5. Concept - এই প্রব্লেম এ প্রধান সমস্যা স্টেটটা ধরতে পারা। dp[i][j] - ধরার অর্থ হলো, i তম পুরুষের সাথে j নারীর বিয়ে দিবো কি না। কিন্তু তার আগে কাদের কাদের বিয়ে হইসে, সেটাই বেশি ইপরটেন্ট
  6. এজন্য dp[i][mask] or dp[i][female] ধরসি, যাতে একেকটা কেস পুরা ইউনিক হয়, এই পুরুষের সাথে কোন কোন নারীর বিয়ে করানো পসিবল হবে না, সেটাই বেশি ইউনিক ও
  7. ইম্পরটেন্ট।
  8. */
  9.  
  10. #include <bits/stdc++.h>
  11. #include<vector>
  12. #define ll                                      long long int
  13. #define ull                                     unsigned long long
  14. #define ld                                      long double
  15.  
  16. #define ff                                      first
  17. #define ss                                      second
  18.  
  19. #define fi                                      freopen("in.txt", "r", stdin)
  20. #define fo                                      freopen("out.txt", "w", stdout)
  21. #define m0(a) memset(a , 0 , sizeof(a))
  22. #define m1(a) memset(a , -1 , sizeof(a))
  23. #define pi acos(-1.0)
  24. #define debug                                   printf("yes\n")
  25. #define what_is(x)                              cout << #x << " is " << x << endl
  26. #define pf                                      printf
  27. #define sf                                      scanf
  28.  
  29. #define pb                                      push_back
  30. #define mp                                      make_pair
  31. #define eb                                      emplace_back
  32. #define pii                                     pair<int, int>
  33. #define piii                                    pair<pii, int>
  34.  
  35. #define SQR(a)                                  ((a)*(a))
  36. #define QUBE(a)                                 ((a)*(a)*(a))
  37.  
  38. #define scanI(a)                                scanf("%d",&a)
  39. #define scanI2(a,b)                             scanI(a) , scanI(b)
  40. #define scanI3(a,b,c)                           scanI(a), scanI(b), scanI(c)
  41. #define scanI4(a,b,c,d)                         scanI(a), scanI(b), scanI(c), scanI(d)
  42.  
  43. #define sll(a)                                scanf("%lld",&a)
  44. #define sll2(a,b)                             sll(a) , sll(b)
  45. #define sll3(a,b,c)                           sll(a), sll(b), sll(c)
  46. #define sll4(a,b,c,d)                         sll(a), sll(b), sll(c), sll(d)
  47.  
  48. #define inf LLONG_MAX
  49. #define minf LLONG_MIN
  50. #define min3(a,b,c) min(a,min(b,c))
  51. #define max3(a,b,c) max(a,max(b,c))
  52. #define ones(mask)  __builtin_popcount(mask)
  53. #define mx 150000
  54.  
  55. using namespace std;
  56.  
  57. ll BigMod(ll B,ll P,ll M)
  58. {
  59.     ll R=1;
  60.     while(P>0)
  61.     {
  62.         if(P%2==1)
  63.         {
  64.             R=(R*B)%M;
  65.         }
  66.         P/=2;
  67.         B=(B*B)%M;
  68.     }
  69.     return R;
  70. }
  71.  
  72. int Set(int N,int pos)
  73. {
  74.     return N=N | (1<<pos);
  75. }
  76. int reset(int N,int pos)
  77. {
  78.     return N= N & ~(1<<pos);
  79. }
  80. bool check(int N,int pos)
  81. {
  82.     return (bool)(N & (1<<pos));
  83. }
  84.  
  85. /************************************** END OF INITIALS ****************************************/
  86.  
  87. ll N ;
  88. ll arr[20][20];
  89. ll dp[20][1<<17] ;
  90.  
  91.  
  92. ll solve(ll i, int female)
  93. {
  94.     if(i >= N)
  95.         return 0 ;
  96.  
  97.     if(dp[i][female] != -1)
  98.         return dp[i][female] ;
  99.  
  100.  
  101.     ll ret = 0 ;
  102.  
  103.     for(ll j = 0 ; j < N ; j++)
  104.     {
  105.         if(!check(female, j))
  106.         {
  107.             ret = max(ret, arr[i][j] + solve(i+1, Set(female, j))) ;
  108.         }
  109.     }
  110.  
  111.     return dp[i][female] = ret ;
  112. }
  113.  
  114.  
  115. int main()
  116. {
  117. //    fi ;
  118. //    fo ;
  119.  
  120.     ll T, t = 0 ;
  121.     scanf("%lld",&T) ;
  122.  
  123.     while(T--)
  124.     {
  125.         t++ ;
  126.         sll(N) ;
  127.  
  128.         m1(dp) ;
  129.  
  130.         for(ll i = 0 ; i < N ; i++)
  131.         {
  132.             for(ll j = 0 ; j < N ; j++)
  133.             {
  134.                 sll(arr[i][j]) ;
  135.             }
  136.         }
  137.  
  138.         ll ans = 0 ;
  139.  
  140.         printf("Case %lld: ", t) ;
  141.  
  142.         cout << solve(0, 0) << endl ;
  143.     }
  144.  
  145.     return 0 ;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment