Advertisement
shamiul93

palindrome partitioning

Jun 2nd, 2017
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.20 KB | None | 0 0
  1.  
  2. // LightOJ always needs this format for sure..so I made a copy of it...
  3. #include <bits/stdc++.h>
  4. #include<vector>
  5. #define ll                                      long long int
  6. #define fi                                      freopen("in.txt", "r", stdin)
  7. #define fo                                      freopen("out.txt", "w", stdout)
  8. #define m0(a) memset(a , 0 , sizeof(a))
  9. #define m1(a) memset(a , -1 , sizeof(a))
  10.  
  11. #define mx 150000
  12. using namespace std;
  13. string s ;
  14. ll N ;
  15.  
  16. class info
  17. {
  18. public:
  19.     ll num ;
  20.     bool isPalin ;
  21.  
  22.     info()
  23.     {
  24.         num = -1 ;
  25.         isPalin = false ;
  26.     }
  27. };
  28.  
  29. info dp[1010][1010] ;
  30.  
  31. info pal(ll i, ll j)
  32. {
  33.     if(dp[i][j].num != -1)
  34.     {
  35.         return dp[i][j] ;
  36.     }
  37.  
  38.     if(i == j)
  39.     {
  40.         dp[i][j].num = 1 ;
  41.         dp[i][j].isPalin = true ;
  42.         return dp[i][j] ;
  43.     }
  44.  
  45.     if(i == j-1 && s[i] != s[j])
  46.     {
  47.         dp[i][j].num = 2 ;
  48.         dp[i][j].isPalin = false ;
  49.         return dp[i][j] ;
  50.     }
  51.  
  52.     if(i == j-1 && s[i] == s[j])
  53.     {
  54.         dp[i][j].num = 1 ;
  55.         dp[i][j].isPalin = true ;
  56.         return dp[i][j] ;
  57.     }
  58.  
  59.     if(s[i] == s[j])
  60.     {
  61.         info t ;
  62.         t = pal(i+1, j-1) ;
  63.  
  64.         if(t.isPalin == true)
  65.         {
  66.             dp[i][j].num = t.num ;
  67.             dp[i][j].isPalin = true ;
  68.             return dp[i][j] ;
  69.         }
  70.         else
  71.         {
  72.             dp[i][j].num = 2 + t.num ;
  73.             dp[i][j].isPalin = false ;
  74.             return dp[i][j] ;
  75.         }
  76.     }
  77.     else
  78.     {
  79.         info t1, t2 ;
  80.         t1 = pal(i, j-1) ;
  81.         t2 = pal(i+1, j) ;
  82.  
  83.         dp[i][j].isPalin = false ;
  84.         dp[i][j].num = 1 + min(t1.num, t2.num) ;
  85.         return dp[i][j] ;
  86.     }
  87. }
  88.  
  89.  
  90. int main()
  91. {
  92.     fi ;
  93.     fo ;
  94.     ll T, t = 0 ;
  95.     scanf("%lld",&T) ;
  96.  
  97.     while(T--)
  98.     {
  99. //        m1(dp) ;
  100.         for(ll i = 0 ; i < 1010 ; i++)
  101.         {
  102.             for(ll j = 0 ; j < 1010 ; j++)
  103.             {
  104.                 dp[i][j].num = -1 ;
  105.                 dp[i][j].isPalin = false ;
  106.             }
  107.         }
  108.  
  109.         t++ ;
  110.         cin >> s ;
  111.         N = s.length() ;
  112.  
  113.         printf("Case %lld: %lld\n",t, pal(0, N-1)) ;
  114.     }
  115.     return 0 ;
  116. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement