Advertisement
Guest User

Untitled

a guest
Sep 23rd, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.23 KB | None | 0 0
  1. //Palindrome Partitioning
  2. //https://br.spoj.com/problems/PAL/
  3. //cf. https://www.youtube.com/watch?v=WPr1jDh3bUQ
  4. #include <bits/stdc++.h>
  5. #define int long long
  6. using namespace std;
  7.  
  8. int32_t main(){
  9.     ios::sync_with_stdio(false); cin.tie(0);
  10.     int n, nteste = 0;
  11.     while(cin >> n, n){
  12.         cout << "Teste " << ++nteste << '\n';
  13.         string x; cin >> x;
  14.         //dp[i][j] true se substr x(i, j) eh palindrome
  15.         vector<vector<bool>> dp(n, vector<bool>(n));
  16.         //single letter palindromes
  17.         for(int i = 0; i < n; ++i)
  18.             dp[i][i] = 1;
  19.         //two letters palindromes
  20.         for(int i = 0; i < n-1; ++i)
  21.             if(x[i] == x[i+1])
  22.                 dp[i][i+1] = 1;
  23.         //palindromes of size 3 to n
  24.         for(int wsize = 3; wsize <= n; ++wsize){
  25.             for(int i = 0; i <= n - wsize; ++i){
  26.                 int j = i + wsize - 1;
  27.                 if(x[i] == x[j] && dp[i+1][j-1]){
  28.                     dp[i][j] = 1;
  29.                 }
  30.             }
  31.         }
  32.         //c[i] guarda o menor número de partes em que a substring x(0, i)
  33.         //pode ser dividida de forma que todas as partes sejam palíndromes
  34.         vector<int> c(n, LLONG_MAX);
  35.         for(int i = 0; i < n; ++i){
  36.             if(dp[0][i]){
  37.                 c[i] = 1;
  38.             }
  39.             else{
  40.                 for(int k = 0; k < i; ++k){
  41.                     if(dp[k+1][i] && c[i] > c[k]+1)
  42.                         c[i] = c[k]+1;
  43.                 }
  44.             }
  45.         }
  46.         cout << c[n-1] << "\n\n";
  47.     }
  48. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement