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.
A 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 " , state[len - 1]); } return 0; }