Cod sursa(job #637233)
#include <cstdio>
#include <string.h>
#include <algorithm>
#include <stdlib.h>
using namespace std;
#define MAXN 512
char S[MAXN];
int i,len,j,p,q,N,L,Lmax;
int mem[MAXN][MAXN],P[MAXN][MAXN];
int caut(int a, int b) {
if(a>b) return 0;
if(a==b && S[a]>=S[a-1]) return 1;
if(mem[a][b]>=0) return mem[a][b];
int i,j,p,R=0;
for(i=a;i<b;i++) {
for(p=1;p<=P[i][0] && P[i][p]<=b;p++) {
j=P[i][p];
if(S[i]>=S[a-1])
R=max(R,2+caut(i+1,j-1));
}
if(S[i]>=S[a-1])
R=max(R,1);
}
return mem[a][b]=R;
}
int main() {
freopen("palm.in","r",stdin);
freopen("palm.out","w",stdout);
fgets(S,sizeof(S),stdin);
N=strlen(S);
while(S[N-1]<'a' || S[N-1]>'z') N--;
for(i=0;i<N-1;i++)
for(j=i+1;j<N;j++)
if(S[i]==S[j])
P[i][++P[i][0]]=j;
for(i=0;i<N;i++)
for(j=i;j<N;j++)
mem[i][j]=-1;
Lmax=1;
for(i=0;i<N-1;i++)
for(q=1;q<=P[i][0];q++) {
j=P[i][q];
L=2+caut(i+1,j-1);
Lmax=max(Lmax,L);
}
printf("%d",Lmax);
}