码迷,mamicode.com
首页 > 其他好文 > 详细

Dynamic Programming [Beginner]~A - Partitioning by Palindromes

时间:2015-11-03 21:15:55      阅读:219      评论:0      收藏:0      [点我收藏+]

标签:

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

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.

Output

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

解题思路:题目大意:给定一个由小写字母组成的字符串,你的任务是把它划分成尽量少的回文串,字符串长度不超过1000.可以用dp。

程序代码:

#include"stdio.h"
#include"iostream"
#include"string.h"
#include"algorithm"
using namespace std;
const int N=1010;
const int INF = (1<<29);

int n;
int dp[N];
char str[N];

bool judge(int left, int right)
{
 for(int i = left, j = right; i <= j; ++i, --j)
  if( str[i] != str[j] ) return false;
 return true;
}

int main()
{

 scanf("%d", &n);
 int i, j;
 while(n--)
 {
  scanf("%s", str+1);
  int len = strlen(str+1);
  for(i = 1; i <= len; ++i)
   dp[i] = INF;

  dp[0] = 0;
  for(i = 1; i <= len; ++i)
  {
   for(j = 1; j <= i; ++j)
   {
    if( judge(j, i) )
     dp[i] = min(dp[i], dp[j-1]+1);
   }
  }

  printf("%d\n", dp[len]);
 }

 return 0;
}

 

Dynamic Programming [Beginner]~A - Partitioning by Palindromes

标签:

原文地址:http://www.cnblogs.com/chenchunhui/p/4934296.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!