Advertisement
Guest User

Untitled

a guest
Jul 18th, 2011
724
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.69 KB | None | 0 0
  1. #include <iostream>
  2. #include <string>
  3. #include <algorithm>
  4. #include <vector>
  5. #include <map>
  6. #include <stdio.h>
  7. #include <cmath>
  8. using namespace std;
  9. int dp[4005];
  10. string s;
  11. int n;
  12. bool pol[4005][4005] = {false};
  13. int path[4005][2] = {0};
  14. int rec (int k)
  15. {
  16.     if (dp[k] != -1)
  17.         return dp[k];
  18.    
  19.     if (pol[0][k])
  20.     {
  21.         path[k][0] = 0;
  22.         path[k][1] = 1;
  23.         return 1;
  24.     }
  25.     int mn = INT_MAX;
  26.     for (int i = 1; i <= k; i++)
  27.     {
  28.         if (pol[i][k])
  29.         {
  30.             int res1 = rec(i - 1) + 1;
  31.             if(res1 < mn)
  32.             {
  33.                 mn = res1;
  34.                 path[k][0] = i;
  35.                 path[k][1] = 1;
  36.             }
  37.         }
  38.         else
  39.         {
  40.             int res2 = rec(i - 1) + k - i + 1;
  41.             if(res2 < mn)
  42.             {
  43.                 mn = res2;
  44.                 path[k][0] = i;
  45.                 path[k][1] = k - i + 1;
  46.             }
  47.         }
  48.     }
  49.     if(mn == INT_MAX)
  50.         mn = 0;
  51.     return dp[k] = mn;
  52. }
  53. int main()
  54. {
  55.     memset(dp,255,sizeof dp);
  56.     //freopen ("input.txt","r",stdin);
  57.     //freopen ("output.txt","w",stdout);
  58.     int m;
  59.     cin >> s;
  60.     int n = s.length();
  61.     for (int i = 0; i < n; i++)
  62.     {
  63.         int l = i;
  64.         int r = i;
  65.         int l1 = i;
  66.         int r1 = i + 1;
  67.         while(l >= 0 && r < n)
  68.             if(s[l] == s[r])
  69.                 pol[l--][r++] = true;
  70.             else
  71.                 break;
  72.  
  73.         while(l1 >= 0 && r1 < n)
  74.             if(s[l1] == s[r1])
  75.                 pol[l1--][r1++] = true;
  76.             else
  77.                 break;
  78.     }
  79.     printf ("%d\n",rec(n - 1));
  80.     int p = n - 1;
  81.     vector<string> resans;
  82.     while (p >= 0)
  83.     {
  84.         int t = path[p][1];
  85.         int len = p - path[p][0] + 1;
  86.         p = path[p][0] - 1;
  87.         if(t == 1)
  88.             resans.push_back(s.substr(p + 1,len));
  89.         else
  90.         {
  91.             for (int i = t; i >= 1; i--)
  92.             {
  93.                 char str[2] = {0};
  94.                 str[0]  = s[p + i];
  95.                 resans.push_back(string(str));
  96.             }
  97.         }
  98.     }
  99.     for (int i = resans.size() - 1; i >= 0; i--)
  100.         cout << resans[i] << " ";
  101.  
  102.     return 0;
  103. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement