#pragma GCC optimize ("Ofast")
#include<bits/stdc++.h>
using namespace std;
template < class S, class T> inline S min_L( S a,T b) {
return a<= b? a: b;
}
#define main dummy_main
int main( ) {
return 0 ;
}
#undef main
int N;
char S[ 502 ] ;
int dp[ 502 ] [ 502 ] ;
int solve( int a, int b) {
if ( a > b) {
return 0 ;
}
if ( dp[ a] [ b] >= 0 ) {
return dp[ a] [ b] ;
}
if ( S[ a] == S[ b] ) {
return dp[ a] [ b] = solve( a+ 1 , b- 1 ) ;
}
return dp[ a] [ b] = min_L( solve( a+ 1 ,b) , solve( a,b- 1 ) ) + 1 ;
}
class Solution{
public :
int minInsertions( string s) {
int i;
N = s.size ( ) ;
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
S[ i] = s[ i] ;
}
for ( i= ( 0 ) ; i< ( N) ; i++ ) {
int j;
for ( j= ( 0 ) ; j< ( N) ; j++ ) {
dp[ i] [ j] = - 1 ;
}
}
return solve( 0 , N- 1 ) ;
}
}
;
// cLay varsion 20200112-1
// --- original code ---
// #define main dummy_main
// {}
// #undef main
//
// int N;
// char S[502];
// int dp[502][502];
//
// int solve(int a, int b){
// if(a > b) return 0;
// if(dp[a][b] >= 0) return dp[a][b];
// if(S[a]==S[b]) return dp[a][b] = solve(a+1, b-1);
// return dp[a][b] = min(solve(a+1,b), solve(a,b-1)) + 1;
// }
//
// class Solution {
// public:
// int minInsertions(string s) {
// N = s.size();
// rep(i,N) S[i] = s[i];
// rep(i,N) rep(j,N) dp[i][j] = -1;
// return solve(0, N-1);
// }
// };
I3ByYWdtYSBHQ0Mgb3B0aW1pemUgKCJPZmFzdCIpCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnRlbXBsYXRlPGNsYXNzIFMsIGNsYXNzIFQ+IGlubGluZSBTIG1pbl9MKFMgYSxUIGIpewogIHJldHVybiBhPD1iP2E6YjsKfQojZGVmaW5lIG1haW4gZHVtbXlfbWFpbgppbnQgbWFpbigpewogIHJldHVybiAwOwp9CiN1bmRlZiBtYWluCmludCBOOwpjaGFyIFNbNTAyXTsKaW50IGRwWzUwMl1bNTAyXTsKaW50IHNvbHZlKGludCBhLCBpbnQgYil7CiAgaWYoYSA+IGIpewogICAgcmV0dXJuIDA7CiAgfQogIGlmKGRwW2FdW2JdID49IDApewogICAgcmV0dXJuIGRwW2FdW2JdOwogIH0KICBpZihTW2FdPT1TW2JdKXsKICAgIHJldHVybiBkcFthXVtiXSA9IHNvbHZlKGErMSwgYi0xKTsKICB9CiAgcmV0dXJuIGRwW2FdW2JdID1taW5fTChzb2x2ZShhKzEsYiksIHNvbHZlKGEsYi0xKSkrIDE7Cn0KY2xhc3MgU29sdXRpb257CiAgcHVibGljOgogIGludCBtaW5JbnNlcnRpb25zKHN0cmluZyBzKXsKICAgIGludCBpOwogICAgTiA9IHMuc2l6ZSgpOwogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIFNbaV0gPSBzW2ldOwogICAgfQogICAgZm9yKGk9KDApO2k8KE4pO2krKyl7CiAgICAgIGludCBqOwogICAgICBmb3Ioaj0oMCk7ajwoTik7aisrKXsKICAgICAgICBkcFtpXVtqXSA9IC0xOwogICAgICB9CiAgICB9CiAgICByZXR1cm4gc29sdmUoMCwgTi0xKTsKICB9Cn0KOwovLyBjTGF5IHZhcnNpb24gMjAyMDAxMTItMQoKLy8gLS0tIG9yaWdpbmFsIGNvZGUgLS0tCi8vICNkZWZpbmUgbWFpbiBkdW1teV9tYWluCi8vIHt9Ci8vICN1bmRlZiBtYWluCi8vIAovLyBpbnQgTjsKLy8gY2hhciBTWzUwMl07Ci8vIGludCBkcFs1MDJdWzUwMl07Ci8vIAovLyBpbnQgc29sdmUoaW50IGEsIGludCBiKXsKLy8gICBpZihhID4gYikgcmV0dXJuIDA7Ci8vICAgaWYoZHBbYV1bYl0gPj0gMCkgcmV0dXJuIGRwW2FdW2JdOwovLyAgIGlmKFNbYV09PVNbYl0pIHJldHVybiBkcFthXVtiXSA9IHNvbHZlKGErMSwgYi0xKTsKLy8gICByZXR1cm4gZHBbYV1bYl0gPSBtaW4oc29sdmUoYSsxLGIpLCBzb2x2ZShhLGItMSkpICsgMTsKLy8gfQovLyAKLy8gY2xhc3MgU29sdXRpb24gewovLyBwdWJsaWM6Ci8vICAgaW50IG1pbkluc2VydGlvbnMoc3RyaW5nIHMpIHsKLy8gICAgIE4gPSBzLnNpemUoKTsKLy8gICAgIHJlcChpLE4pIFNbaV0gPSBzW2ldOwovLyAgICAgcmVwKGksTikgcmVwKGosTikgZHBbaV1bal0gPSAtMTsKLy8gICAgIHJldHVybiBzb2x2ZSgwLCBOLTEpOwovLyAgIH0KLy8gfTsK