Kaidul

Navid and Coins

Sep 5th, 2014
262
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.90 KB | None | 0 0
  1. /****************************************************
  2. ***   Problem       : Mike and Stamps
  3. ***   Author        : Kaidul Islam
  4. ***   E-mail        : [email protected]
  5. ***   University    : KUET, Dept. of CSE
  6. ***   Blog          : http://kaidul.efireit.com
  7. ****************************************************/
  8. #include <bits/stdc++.h>
  9.  
  10. using namespace std;
  11.  
  12. #define MEMSET_INF 127
  13. #define MEMSET_HALF_INF 63
  14. #define stream istringstream
  15. #define rep(i,n) for(__typeof(n) i=0; i<(n); i++)
  16. #define repl(i,n) for(__typeof(n) i=1; i<=(n); i++)
  17. #define FOR(i,a,b) for(__typeof(b) i=(a); i<=(b); i++)
  18. #define forstl(i, s) for (__typeof ((s).end ()) i = (s).begin (); i != (s).end (); ++i)
  19. #define INF (1<<30)
  20. #define PI acos(-1.0)
  21. #define pb push_back
  22. #define ppb pop_back
  23. #define all(x) x.begin(),x.end()
  24. #define mem(x,y) memset(x,y,sizeof(x))
  25. #define memsp(x) mem(x,MEMSET_INF)
  26. #define memdp(x) mem(x,-1)
  27. #define memca(x) mem(x,0)
  28. #define eps 1e-9
  29. #define pii pair<int,int>
  30. #define pmp make_pair
  31. #define ft first
  32. #define sd second
  33. #define vi vector<int>
  34. #define vpii vector<pii>
  35. #define si set<int>
  36. #define msi map<string , int >
  37. #define mis map<int , string >
  38. typedef long long i64;
  39. typedef unsigned long long ui64;
  40. /** function **/
  41. #define SDi(x) sf("%d", &x)
  42. #define SDl(x) sf("%lld", &x)
  43. #define SDs(x) sf("%s", x)
  44. #define SD2(x,y) sf("%d%d", &x, &y)
  45. #define SD3(x,y,z) sf("%d%d%d", &x, &y, &z)
  46. #define pf printf
  47. #define print(x) pf("%d ", x)
  48. #define println(x) pf("%d\n", x)
  49. #define sf scanf
  50. #define READ(f) freopen(f, "r", stdin)
  51. #define WRITE(f) freopen(f, "w", stdout)
  52.  
  53. /** Implementation **/
  54. #define M 20
  55. #define Max 20000
  56.  
  57. int N, m, maxM;
  58. bool flag[M + 1][Max + 1];
  59. bool exclusive[M + 1][M + 1];
  60.  
  61. int dp[(1 << M) + 1];
  62.  
  63. bool isOkay(int mask, int i) {
  64.     if(mask & (1 << i)) return false;
  65.     rep(pos, m) {
  66.         if(mask & (1 << pos)) {
  67.             if(exclusive[i][pos])
  68.                 return false;
  69.         }
  70.     }
  71.     return true;
  72. }
  73.  
  74. int solve(int i, int mask) {
  75.     if(i == m) return 0;
  76.     if(mask == maxM) return 0;
  77.     if(dp[mask] != -1) return dp[mask];
  78.     int count1 = 0, count2 = 0;
  79.  
  80.     if(isOkay(mask, i))
  81.         count1 = 1 + solve(i + 1, mask | (1 << i));
  82.  
  83.     count2 = solve(i + 1, mask);
  84.  
  85.     return dp[mask] = max(count1, count2);
  86. }
  87.  
  88. int main(void) {
  89. #ifndef ONLINE_JUDGE
  90.     READ("input.txt");
  91. #endif
  92.     int k, value;
  93.     SD2(N, m);
  94.     maxM = (1 << m) - 1;
  95.     rep(i, m) {
  96.         SDi(k);
  97.         rep(j, k) {
  98.             SDi(value);
  99.             flag[i][value] = true;
  100.         }
  101.     }
  102.     // O(m * m * n) preprocessing
  103.     rep(i, m) {
  104.         FOR(j, i + 1, m - 1) {
  105.             FOR(k, 1, N) {
  106.                 if(flag[i][k] and flag[j][k]) {
  107.                     exclusive[i][j] = exclusive[j][i] = true;
  108.                 }
  109.             }
  110.         }
  111.     }
  112.     mem(dp, -1);
  113.     int ans = solve(0, 0);
  114.     println(ans);
  115.     return 0;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment