#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int findpali( string s, int dp[ ] [ 100 ] , int st, int e) ;
int main( void )
{
string s = "ABCD" ;
int dp[ 100 ] [ 100 ] ;
for ( int i = 0 ; i < 100 ; i++ )
for ( int j = 0 ; j < 100 ; j++ )
dp[ i] [ j] = - 1 ;
int out = findpali( s, dp, 0 , s.length ( ) - 1 ) ;
cout << out << "\n " ;
return 0 ;
}
int findpali( string s, int dp[ ] [ 100 ] , int st, int e) // st ->starting position, e -> ending position
{
size_t length = s.length ( ) ;
if ( st < 0 || st >= length || e < 0 || e >= length)
cout << "This is trouble!!" << " st = " << st << " e = " << e << " but s has length " << length << "\n " ;
if ( s.length ( ) == 1 )
{
dp[ st] [ e] = 1 ;
return 1 ;
}
else if ( s.length ( ) == 2 && s[ st] == s[ e] )
{
dp[ st] [ e] = 2 ;
return 2 ;
}
else if ( dp[ st] [ e] ! = - 1 )
return dp[ st] [ e] ;
else if ( s[ st] == s[ e] )
{
dp[ st] [ e] = findpali( s.substr ( st + 1 , s.length ( ) - 2 ) , dp, st + 1 , e - 1 ) + 2 ;
return dp[ st] [ e] ;
}
else
{
dp[ st] [ e] = max( findpali( s.substr ( st, s.length ( ) - 1 ) , dp, st, e - 1 ) , findpali( s.substr ( st + 1 , s.length ( ) - 1 ) , dp, st + 1 , e) ) ;
return dp[ st] [ e] ;
}
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IGZpbmRwYWxpKHN0cmluZyBzLCBpbnQgZHBbXVsxMDBdLCBpbnQgc3QsIGludCBlKTsKaW50IG1haW4odm9pZCkKewogICAgc3RyaW5nIHMgPSAiQUJDRCI7CiAgICBpbnQgZHBbMTAwXVsxMDBdOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7IGkrKykKICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDEwMDsgaisrKQogICAgICAgICAgICBkcFtpXVtqXSA9IC0xOwogICAgaW50IG91dCA9IGZpbmRwYWxpKHMsIGRwLCAwLCBzLmxlbmd0aCgpIC0gMSk7CiAgICBjb3V0IDw8IG91dCA8PCAiXG4iOwogICAgcmV0dXJuIDA7Cn0KCgoKaW50IGZpbmRwYWxpKHN0cmluZyBzLCBpbnQgZHBbXVsxMDBdLCBpbnQgc3QsIGludCBlKSAvLyBzdCAtPnN0YXJ0aW5nIHBvc2l0aW9uLCBlIC0+IGVuZGluZyBwb3NpdGlvbgp7CiAgICBzaXplX3QgbGVuZ3RoID0gcy5sZW5ndGgoKTsKICAgIGlmIChzdCA8IDAgfHwgc3QgPj0gbGVuZ3RoIHx8IGUgPCAwIHx8IGUgPj0gbGVuZ3RoKQogICAgICAgIGNvdXQgPDwgIlRoaXMgaXMgdHJvdWJsZSEhIiA8PCAiICBzdCA9ICIgPDwgc3QgPDwgIiAgZSA9ICIgPDwgZSA8PCAiICBidXQgcyBoYXMgbGVuZ3RoICIgPDwgbGVuZ3RoIDw8ICJcbiI7CiAgICBpZiAocy5sZW5ndGgoKSA9PSAxKQogICAgewogICAgICAgIGRwW3N0XVtlXSA9IDE7CiAgICAgICAgcmV0dXJuIDE7CiAgICB9CiAgICBlbHNlIGlmIChzLmxlbmd0aCgpID09IDIgJiYgc1tzdF0gPT0gc1tlXSkKICAgIHsKICAgICAgICBkcFtzdF1bZV0gPSAyOwogICAgICAgIHJldHVybiAyOwogICAgfQogICAgZWxzZSBpZiAoZHBbc3RdW2VdICE9IC0xKQogICAgICAgIHJldHVybiBkcFtzdF1bZV07CiAgICBlbHNlIGlmIChzW3N0XSA9PSBzW2VdKQogICAgewogICAgICAgIGRwW3N0XVtlXSA9IGZpbmRwYWxpKHMuc3Vic3RyKHN0ICsgMSwgcy5sZW5ndGgoKSAtIDIpLCBkcCwgc3QgKyAxLCBlIC0gMSkgKyAyOwogICAgICAgIHJldHVybiBkcFtzdF1bZV07CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZHBbc3RdW2VdID0gbWF4KGZpbmRwYWxpKHMuc3Vic3RyKHN0LCBzLmxlbmd0aCgpIC0gMSksIGRwLCBzdCwgZSAtIDEpLCBmaW5kcGFsaShzLnN1YnN0cihzdCArIDEsIHMubGVuZ3RoKCkgLSAxKSwgZHAsIHN0ICsgMSwgZSkpOwogICAgICAgIHJldHVybiBkcFtzdF1bZV07CiAgICB9Cn0=