Advertisement
shamiul93

(BitMask) UVa - 10651 - Pebble Solitaire

Jun 4th, 2017
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.97 KB | None | 0 0
  1. /**
  2. @author - Rumman BUET CSE'15
  3. Problem - UVa   10651   Pebble Solitaire
  4.  
  5. Concept - Bit mask DP
  6.  
  7. Idea - এটা আমার জীবনে প্রথম বিট্মাস্ক ডিপি প্রব্লেম ।
  8.  
  9. প্রশ্ন পড়লেই বুঝা যায় কি করা লাগবে । আমি প্রথমে লুপ চালাইসি । দেখসি এটা ১ কি না । যদি ১ হয় , তাইলে চেষ্টা করবো ডানে বা বামে যাবার ।
  10. ডানে বা বামে যাবো কি না সেটা ডিপেন্ড করবে শর্ত দেয়া আছে ওই ২ টা শরতের উপর । তো  ধরি , বামে গেলাম রিকারসিভ কলের মাধ্যমে ।
  11. ওইখান থেকে একটা অ্যান্সার রিটার্ন করবে । এই এন্সার কি আগের এন্সারের চেয়ে ছোট ? তাইলে এটা । নাইলে আগের টা এন্সার ।
  12. এবার ডানে যাবো । একই ভাবে এন্সার পাবো ।
  13.  
  14. পুরা বিট্মাস্কের শুরু থেকে শেষ পর্যন্ত এভাবে লুপ চালায়ে যাবো । এন্সারে লাস্ট পর্যন্ত যা থাকবে তাই এন্সার ।
  15.  
  16. শিক্ষাঃ ***** আমার সেট , রিসেট ফাংশনে রেফারেন্স ভ্যারিয়েবল দিসি । সো , এসব ইউজ করলে পারমানেটলি ভ্যালু চেঞ্জ হয়ে যাবে । সো , এসব ইউজের সময় সাবধান !!!
  17.  
  18.  
  19. **** কোন একটা স্টেটে কাজ করার সময় ভুলেও ওই স্টেটের বিট্মাস্ক জীবনে ও পারমানেন্টলি চেঞ্জ করা যাবে না ।
  20. যদি পরের স্টেটে রিকারশনে পাঠাতে হয় , তাইলে আরেক ভ্যারিয়েবলের মধ্যে এটাকে ঢুকাও । এরপর ওটাকে চেঞ্জ করে পাঠাও ।
  21.  
  22. ***** এক সল্যুশন দেখলাম সল্ভের পর । GCC এর বিল্ট ইন ফাংশন আছে । বিট্মাস্কে কয়টা ১ আছে বলার জন্য । এটা ভালো । ইউজ করা যাবে ।
  23.  
  24. এটা হলো -    "__builtin_popcount(mask)"
  25.  
  26.  
  27. */
  28.  
  29. // LightOJ always needs this format for sure..so I made a copy of it...
  30. #include <bits/stdc++.h>
  31. #include<vector>
  32. #define ll                                      long long int
  33. #define fi                                      freopen("in.txt", "r", stdin)
  34. #define fo                                      freopen("out.txt", "w", stdout)
  35. #define m0(a) memset(a , 0 , sizeof(a))
  36. #define m1(a) memset(a , -1 , sizeof(a))
  37. #define inf INT_MAX
  38. #define min3(a,b,c) min(a,min(b,c))
  39. #define max3(a,b,c) max(a,max(b,c))
  40.  
  41. #define ones(mask)  __builtin_popcount(mask) /// __builtin_popcount : it's a built in function of GCC. Finds out the numbers of 1 in binary representation.
  42.  
  43. #define mx 150000
  44.  
  45. using namespace std;
  46.  
  47. string s ;
  48.  
  49. int Set(int &N,int pos)
  50. {
  51.     return N=N | (1<<pos);
  52. }
  53. int reset(int &N,int pos)
  54. {
  55.     return N= N & ~(1<<pos);
  56. }
  57. bool check(int N,int pos)
  58. {
  59.     return (bool)(N & (1<<pos));
  60. }
  61.  
  62. int N ;
  63. int dp[(1<<12) + 5] ;
  64.  
  65.  
  66. int solve(int mask)
  67. {
  68.     if(dp[mask] != -1)
  69.     {
  70.         return dp[mask] ;
  71.     }
  72.  
  73.     int ans = ones(mask) ;
  74.  
  75.     for(int i = 0 ; i < N ; i++)
  76.     {
  77.         if(check(mask, i))
  78.         {
  79.  
  80.             if(i+2 <= N-1 && check(mask, i) && check(mask, i+1) && !check(mask, i+2) )
  81.             {
  82.                 int m = mask ;
  83.                 reset(m, i) ;
  84.                 reset(m, i+1) ;
  85.                 Set(m, i+2) ;
  86.                 ans = min(ans, solve(m)) ;
  87.             }
  88.  
  89.             if(i-2 >= 0 && check(mask, i) && check(mask, i-1) && !check(mask, i-2))
  90.             {
  91.                 int m = mask ;
  92.                 reset(m, i) ;
  93.                 reset(m, i-1) ;
  94.                 Set(m, i-2) ;
  95.                 ans = min(ans, solve(m)) ;
  96.             }
  97.         }
  98.     }
  99.  
  100.     return dp[mask] = ans ;
  101. }
  102.  
  103.  
  104. int main()
  105. {
  106. //    fi ;
  107. //    fo ;
  108.     ll T, t = 0 ;
  109.     scanf("%lld",&T) ;
  110.  
  111.     while(T--)
  112.     {
  113.         m1(dp) ;
  114.         t++ ;
  115.         cin >> s ;
  116.  
  117.         N = s.size() ;
  118.         int mask  = 0 ;
  119.  
  120.         for(int i = 0 ; i < N ; i++)
  121.         {
  122.             if(s[i] == 'o')
  123.             {
  124.                 Set(mask, N-1-i) ;
  125.             }
  126.         }
  127.  
  128.         cout << solve(mask) << endl  ;
  129.     }
  130.     return 0 ;
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement