UVA 11584

Problem H: Partitioning by Palindromes

We say a sequence of characters is a palindrome if it is the same written forwards and backwards. For example, 'racecar' is a palindrome, but 'fastcar' is not.

partition of a sequence of characters is a list of one or more disjoint non-empty groups of consecutive characters whose concatenation yields the initial sequence. For example, ('race', 'car') is a partition of 'racecar' into two groups.

Given a sequence of characters, we can always create a partition of these characters such that each group in the partition is a palindrome! Given this observation it is natural to ask: what is the minimum number of groups needed for a given string such that every group is a palindrome?

For example:

  • 'racecar' is already a palindrome, therefore it can be partitioned into one group.
  • 'fastcar' does not contain any non-trivial palindromes, so it must be partitioned as ('f', 'a', 's', 't', 'c', 'a', 'r').
  • 'aaadbccb' can be partitioned as ('aaa', 'd', 'bccb').

Input begins with the number n of test cases. Each test case consists of a single line of between 1 and 1000 lowercase letters, with no whitespace within.

For each test case, output a line containing the minimum number of groups required to partition the input into groups of palindromes.

Sample Input

3

racecar

fastcar

aaadbccb

Sample Output

1

7

3


Kevin Waugh

这道题倒是没什么可说的,简单的DP入门题 , 但我却在题以外的地方上WA了好久发火

谁能告诉我ios::sync_with_stdio(false);再用cin ,cout 会判错!!!求科普!

悬赏解答该问题!

 

#include <cstdio>

#include <cmath>

#include <algorithm>

#include <iostream>

#include <cstring>

#include <map>

#include <string>

#include <stack>

#include <cctype>

#include <vector>

#include <queue>

#include <set>



using namespace std;

const int MAXN = 1010 + 50;

const int maxw = 100 + 20;

const long long LLMAX = 0x7fffffffffffffffLL;

const long long LLMIN = 0x8000000000000000LL;

const int INF = 0x7fffffff;

const int IMIN = 0x80000000;

#define eps 1e10-8

#define mod 1000000007

typedef long long LL;

const double PI = acos(-1.0);

typedef double D;



//#define Online_Judge

#define outstars cout << "***********************" << endl;

#define clr(a,b) memset(a,b,sizeof(a))



#define FOR(i , x , n) for(int i = (x) ; i < (n) ; i++)

#define FORR(i , x , n) for(int i = (x) ; i <= (n) ; i++)

#define REP(i , x , n) for(int i = (x) ; i > (n) ; i--)

#define REPP(i ,x , n) for(int i = (x) ; i >= (n) ; i--)

char inp[MAXN];

int state[MAXN];///记录从头到i的最少回文串数

bool isPalindrome(int s , int t)

{

    while(s < t)

    {

        if(inp[s] != inp[t])return false;

        s++;

        t--;

    }

    return true;

}

int main()

{

    //ios::sync_with_stdio(false);

    #ifdef Online_Judge

        freopen("in.txt","r",stdin);

        freopen("out.txt","w",stdout);

    #endif // Online_Judge

    int T;

    cin >> T;

    while(T--)

    {

        scanf("%s",inp);

        int len = strlen(inp);

        FOR(i , 0 , len)state[i] = INF;

        state[0] = 1;

        FOR(i , 1 , len)FORR(j ,0 , i)

        {

            if(isPalindrome(j , i))

            {

                if(j == 0)state[i] = min(state[i] , 1);

                else state[i] = min(state[j - 1] + 1 , state[i]);

            }

        }

        printf("%d\n" , state[len - 1]);

    }

    return 0;

}



你可能感兴趣的:(uva)