Advertisement
shamiul93

1025 - The Specials Menu

Jun 27th, 2017
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.80 KB | None | 0 0
  1. /**
  2. @author - Rumman BUET CSE'15
  3. Problem - 1025 - The Specials Menu
  4.  
  5. Concept - DP .
  6.  
  7. প্রব্লেম টা ঝামেলা আছে । তাও ৮০০+ সল্ভ ।
  8. যাই হোক , প্রব্লেমের মূল বক্তব্য হলো - একটা স্ট্রিং এর মধ্যে কতগুলা প্যালিন্ড্রোমিক সাব সিকোয়েন্স হইতে পারে ? এই সংখ্যাটা বাইর করা লাগবে ।
  9.  
  10. ১। যখন দেখবা , s[i] == s[j] , ধরি , s[i] == 'a' , s[j] == 'a' , তাইলে কি হবে ? aa এটা একটা পসিবল সিকু , এর জন্য ১ যোগ হবে ,
  11. আর এর সাথে যোগ করা লাগবে এই ২ টার মাঝখানে যতটুক স্ট্রিং আছে তার এন্সার ।
  12. কিন্তু এছাড়াও কি আরো ওয়ে থাকতে পারে না ? যদি প্রথম ও শেষের অক্ষর সমান হয় ? পারে । যদি প্রথম অক্ষর টাকে নিয়া কোন প্যালিন পাওয়া যায় , কিন্তু শেষ টারে বাদ দিয়ে ।
  13. আবার শেষ টারে নিয়া , প্রথম টা বাদ দিয়ে । কিন্তু দেখো , এদের ২ জনের মধ্যেই  a[i+1][j-1] আছে । ২ বার যোগ হইসে । তাই ১ বার বিয়োগ দিবা ।
  14.  
  15. ২। সমান না হইলে শুধু  প্রথম অক্ষর টাকে নিয়া কোন প্যালিন পাওয়া যায় , কিন্তু শেষ টারে বাদ দিয়ে , সেটা হিসাব করবা ।
  16. আবার শেষ টারে নিয়া , প্রথম টা বাদ দিয়ে । কিন্তু দেখো , এদের ২ জনের মধ্যেই  a[i+1][j-1] আছে । ২ বার যোগ হইসে । তাই ১ বার বিয়োগ দিবা ।
  17.  
  18. *** ঝামেলা আছে । দেখে দেখে রাখা লাগবে ।
  19.  
  20. **/
  21.  
  22.  
  23. // LightOJ always needs this format for sure..so I made a copy of it...
  24. #include <bits/stdc++.h>
  25. #include<vector>
  26. #define ll                                      long long int
  27. #define fi                                      freopen("in.txt", "r", stdin)
  28. #define fo                                      freopen("out.txt", "w", stdout)
  29. #define m0(a) memset(a , 0 , sizeof(a))
  30. #define m1(a) memset(a , -1 , sizeof(a))
  31. #define inf LLONG_MAX
  32. #define min3(a,b,c) min(a,min(b,c))
  33. #define max3(a,b,c) max(a,max(b,c))
  34. #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.
  35. #define mx 150000
  36.  
  37. using namespace std;
  38.  
  39. ll dp[70][70] ;
  40. string s ;
  41. ll len ;
  42.  
  43. ll solve(ll i , ll j)
  44. {
  45.     if(j < i)
  46.         return dp[i][j] = 0 ;
  47.     if(i == j)
  48.         return dp[i][j] = 1 ;
  49.     if(dp[i][j] != -1)
  50.         return dp[i][j] ;
  51.  
  52.     if(s[i] == s[j])
  53.     {
  54.         dp[i][j] = (1 + solve(i+1,j-1)) + (solve(i,j-1) + solve(i+1,j) - solve(i+1,j-1)) ;
  55.     }
  56.     else
  57.     {
  58.         dp[i][j] = solve(i,j-1) + solve(i+1,j) - solve(i+1,j-1) ;
  59.     }
  60.     return dp[i][j] ;
  61. }
  62.  
  63. int main()
  64. {
  65. //    fi ; fo ;
  66.     ll T, t = 0 ;
  67.     scanf("%lld",&T) ;
  68.  
  69.     while(T--)
  70.     {
  71.         t++ ;
  72.  
  73.         m1(dp) ;
  74.         cin >> s ;
  75.         len = s.size() ;
  76.         ll ans = solve(0,len-1) ;
  77.  
  78.         printf("Case %lld: ",t) ;
  79.         cout << ans << endl ;
  80.     }
  81.     return 0 ;
  82. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement