Light oj 1044 - Palindrome Partitioning(记忆化)

来源:互联网 发布:网络与共享中心打不开 编辑:程序博客网 时间:2024/05/24 02:15

1044 - Palindrome Partitioning
PDF (English)StatisticsForum
Time Limit: 1 second(s)Memory Limit: 32 MB

A palindrome partition is the partitioning of a string such that each separate substring is a palindrome.

For example, the string "ABACABA" could be partitioned in several different ways, such as {"A","B","A","C","A","B","A"}, {"A","BACAB","A"}, {"ABA","C","ABA"}, or {"ABACABA"},among others.

You are given a string s. Return the minimum possible number of substrings in a palindrome partition of s.

Input

Input starts with an integer T (≤ 40), denoting the number of test cases.

Each case begins with a non-empty string s of uppercase letters with length no more than 1000.

Output

For each case of input you have to print the case number and the desired result.

Sample Input

Output for Sample Input

3

AAAA

ABCDEFGH

QWERTYTREWQWERT

Case 1: 1

Case 2: 8

Case 3: 5

 





#pragma comment(linker, "/STACK:1024000000,1024000000")#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<cmath>#include<queue>#include<stack>#include<vector>#include<set>#include<map>#define L(x) (x<<1)#define R(x) (x<<1|1)#define MID(x,y) ((x+y)>>1)#define bug printf("hihi\n")#define eps 1e-8typedef long long ll;using namespace std;#define INF 0x3f3f3f3f#define N 1005int dp[N][N],ok[N][N];int len;char c[N];void inint(){    int i,j;    memset(ok,0,sizeof(ok));    for(int i=0;i<len;i++)        ok[i][i]=1;    for(int i=0;i<len-1;i++)        ok[i][i+1]=c[i]==c[i+1] ? 1:0;   for(int k=3;k<=len;k++)     for(int i=0;i+k<=len;i++)     {         int j=i+k-1;         ok[i][j]= ok[i+1][j-1]&&c[i]==c[j] ? 1:0;     }}int dfs(int s,int e){    if(s>e) return 0;    if(s==e) return dp[s][e]=1;    if(dp[s][e]>=0) return dp[s][e];    dp[s][e]=INF;    for(int j=s;j<=e;j++)        if(ok[s][j]) dp[s][e]=min(dp[s][e],1+dfs(j+1,e));    return dp[s][e];}int main(){    int i,j,t,ca=0;    scanf("%d",&t);    while(t--)    {        scanf("%s",c);        len=strlen(c);        inint();        memset(dp,-1,sizeof(dp));        printf("Case %d: %d\n",++ca,dfs(0,len-1));    }    return 0;}






0 0
原创粉丝点击