G - dp-easy

来源:互联网 发布:java中时间格式化 编辑:程序博客网 时间:2024/04/30 21:34
点击打开链接

G -dp-easy
Crawling in process...Crawling failed
Time Limit:1000MS    Memory Limit:0KB     64bit IO Format:%lld & %llu
SubmitStatus

Description

Download as PDF

Problem H: Partitioning by Palindromes

Can you read upside-down?

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

3racecarfastcaraaadbccb

Sample Output

173

Kevin Waugh



这是一道动态规划基本题,还没学到DP,不过在师姐的大力讲解下,总算是明白个差不多了。

#include<stdio.h>#include<string.h>const int INF=(1<<29);char z[1007];int dp[1007];bool judge(int left,int right){      for(int c=left,d=right;c<=d;++c,--d)      if(z[c]!=z[d])return false;      return true;}int min(int x,int y){   return x<y?x:y;}int main(){    int n;    while(scanf("%d",&n)!=EOF)    {        while(n--)        {            scanf("%s",z+1);            dp[0]=0;            int len=strlen(z+1);            for(int i=1;i<=len;++i)            dp[i]=INF;            for(int a=1;a<=len;++a)            for(int b=1;b<=a;++b)            if(judge(b,a))            dp[a]=min(dp[a],dp[b-1]+1);            printf("%d\n",dp[len]);        }    }    return 0;}


原创粉丝点击