Kaidul

UVa 11022

Nov 30th, 2013
208
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.07 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. #define Max 80
  6.  
  7. int dp[Max][Max];
  8. char s[Max];
  9.  
  10. int dfs(int begin, int end) {
  11.    
  12.     if(begin == end)
  13.         return 1;
  14.    
  15.     if(dp[begin][end])
  16.         return dp[begin][end];
  17.        
  18.     int ret = INT_MAX;
  19.    
  20.     for(int i = begin; i < end; i++)
  21.         ret = min(ret, dfs(begin, i) + dfs(i + 1, end));
  22.    
  23.     for(int i = 1, length = end - begin + 1; i <= length; i++) {
  24.         if(length % i == 0) {
  25.             int k = begin, j = 0;
  26.             for(; k <= end; k++) {
  27.                 if(s[k] != s[j + begin])
  28.                     break;
  29.                 ++j;
  30.                 if(j >= i)  j = 0;
  31.             }
  32.             if(k == end + 1 and end != begin + i - 1)
  33.                 ret = min( ret, dfs(begin, begin + i - 1) );
  34.         }
  35.     }
  36.     return dp[begin][end] = ret;
  37. }
  38.  
  39. int main(void) {
  40.     while(~scanf("%s", s)) {
  41.         if( !strcmp(s, "*") )
  42.             break;
  43.         memset(dp, 0, sizeof dp);
  44.         int len = strlen(s);
  45.         printf( "%d\n", dfs(0, len - 1) );
  46.     }
  47.     return 0;
  48. }
Advertisement
Add Comment
Please, Sign In to add comment