10617 - Again Palindrome
Again Palindromes
Input: Standard Input
Output: Standard Output
Time Limit: 2 Seconds
A palindorme is a sequence of one or morecharacters that reads the same from the left as it does from the right. Forexample, Z, TOT and MADAM are palindromes, but ADAM is not.
Given a sequence S of N capital latinletters. How many ways can one score out a few symbols (maybe 0) that the restof sequence become a palidrome. Varints that are only different by an order of scoring out shouldbe considered the same.
Input
The input file contains several test cases(less than 15). The first line contains an integer T that indicates how manytest cases are to follow.
Each of the T lines contains a sequence S(1≤N≤60). So actually each of these lines is a test case.
Output
For each test case output in a single linean integer – the number of ways.
Sample Input Output for Sample Input
3
BAOBAB
AAAA
ABA
22
15
5
Russian Olympic Camp
#include <cstdio>
#include <cstring>
#define MAXN 70
long long f[MAXN][MAXN];
int n;
char s[MAXN];
void dpit()
{
memset(f,0,sizeof(f));
for(int i=1;i<=n;i++)
f[i][i]=1;
for(int p=1;p<=n;p++)
for (int i=1;i<=n;i++)
{
int j=i+p;
if (j>n) break;
f[i][j]=f[i+1][j-1]+2;
for(int k=i+1;k<=j;k++)
if (s[i]==s[k])
f[i][j]+=f[i+1][k-1]+1;
for(int k=i;k<=j-1;k++)
if (s[j]==s[k])
f[i][j]+=f[k+1][j-1]+1;
if (s[i]==s[j])
f[i][j]=f[i][j]-1-f[i+1][j-1];
// printf("%d %d %d\n",i,j,f[i][j]);
}
}
int main()
{
int t,ans;
scanf("%d",&t);
getchar();
while (t--)
{
gets(s+1);
n=strlen(s+1);
dpit();
printf("%lld\n",f[1][n]);
}
return 0;
}