char s[5001]; int l; char memo[5000][5001]; bool ispali(int a,int b){ if(memo[a][b]){ return memo[a][b]>0; } { bool z; if(a+1==b){ z=true; }else if(a+2==b){ z=s[a]==s[b-1]; }else{ z=ispali(a+1,b-1)&&s[a]==s[b-1]; } memo[a][b]=z?1:-1; return z; } } int d[5001]; { rd(s@l); d[0]=l; rep(i,l){ rep(j,i+1,l+1){ if(ispali(i,j)){ d[j]>?=min(d[i],j-i); } } } wt(d[l]); }