Cod sursa(job #637478)
#include <cstdio>
#include <string>
#include <algorithm>
#include <fstream>
#include <map>
using namespace std;
#define MAXN 512
string S;
int i,len,j,p,q,N,L,Lmax;
//int mem[MAXN][MAXN];
int Ind[MAXN][MAXN];
map<int, int> mem[MAXN];
ifstream fin("palm.in");
ofstream fout("palm.out");
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];
if(mem[a].count(b)>0) return mem[a][b];
int i,j,R=0;
for(i=a;i<b;++i) {
if(S[i]<S[a-1]) continue;
if(R==0) R=1;
j=Ind[i][b];
if(j<=i) continue;
R=max(R,2+caut(i+1,j-1));
}
return mem[a][b]=R;
}
int main() {
fin >> S;
N=S.size();
for(i=0;i<N-1;++i) {
p=0;
for(j=i+1;j<N;++j) {
if(S[i]==S[j])
p=j;
Ind[i][j]=p; // <=j
//mem[i][j]=-1;
}
}
Lmax=1;
for(i=0;i<N-1;++i) {
j=Ind[i][N-1];
if(j<=i) continue;
L=2+caut(i+1,j-1);
Lmax=max(Lmax,L);
}
fout << Lmax;
}