//link: http://lightoj.com/volume_showproblem.php?problem=1033 #include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<map> #include<utility> #include<set> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) FOR(i, 0, n) #define sf scanf #define pf printf #define pb push_back #define MP make_pair #define fr first #define sc second #define ll long long #define dd double #define all(v) v.begin(), v.end() #define PI acos(-1.0) #define mem(ara, value) memset(ara, value, sizeof(ara)) #define paii pair<int, int> #define pall pair<ll, ll> #define SZ(a) int(a.size()) #define read(nm) freopen(nm, "r", stdin) #define write(nm) freopen(nm, "w", stdout) #define dump(x) cout<<#x<<" = "<<x<<endl using namespace std; #define take(args...) asdf,args #define debug(args...) asdfg,args; cout<<endl struct ASDF{ ASDF& operator,(int &a) { sf("%d", &a); return *this; } ASDF& operator,(long int &a){ sf("%ld", &a); return *this; } ASDF& operator,(long long int &a){ sf("%lld", &a); return *this; } ASDF& operator,(char &c){ sf("%c", &c); return *this; } ASDF& operator,(double &d){ sf("%lf", &d); return *this; } template<typename T> ASDF& operator,(T &a){ cin>>a; return *this; } }asdf; struct ASDFG{ template<typename T> ASDFG& operator,(vector<T> &v){ pf("["); cout<<v[0]; FOR(i, 1, SZ(v)){ cout<<", "<<v[i]; } pf("]"); return *this; } template<typename T> ASDFG& operator,(T x) { cout<<x<<" "; return *this; } }asdfg; //Header ends here #define MAXX 102 char str[MAXX]; int dp[MAXX][MAXX]; int len; int min_cost(int i, int j) { if(i < 0) return len - j; if(j >= len) return i+1; int &ret = dp[i][j]; if(ret != -1) return ret; if(str[i] == str[j]) { return ret = min_cost(i-1, j+1); } else { return ret = 1 + min( min_cost(i-1, j), min_cost(i, j+1) ); } } int main() { int kases, kaseno = 0; take(kases); while(kases--) { scanf("%s", str); len = strlen(str); mem(dp, -1); int res = 1<<29; for(int i=0; i<len-1; i++) { res = min( res, min_cost(i, i) ); res = min(res, min_cost(i, i+1)); } pf("Case %d: %d\n", ++kaseno, len==1?0:res); } }
Another solution using LCS directly
#include<iostream> #include<cstdio> #include<cstring> #include<cstdlib> #include<cmath> #include<algorithm> #include<vector> #include<queue> #include<stack> #include<map> #include<utility> #include<set> #define FOR(i, s, e) for(int i=s; i<e; i++) #define loop(i, n) FOR(i, 0, n) #define sf scanf #define pf printf #define pb push_back #define MP make_pair #define fr first #define sc second #define ll long long #define dd double #define all(v) v.begin(), v.end() #define PI acos(-1.0) #define mem(ara, value) memset(ara, value, sizeof(ara)) #define paii pair<int, int> #define pall pair<ll, ll> #define SZ(a) int(a.size()) #define read(nm) freopen(nm, "r", stdin) #define write(nm) freopen(nm, "w", stdout) #define dump(x) cout<<#x<<" = "<<x<<endl using namespace std; #define take(args...) asdf,args #define debug(args...) asdfg,args; cout<<endl struct ASDF{ ASDF& operator,(int &a) { sf("%d", &a); return *this; } ASDF& operator,(long int &a){ sf("%ld", &a); return *this; } ASDF& operator,(long long int &a){ sf("%lld", &a); return *this; } ASDF& operator,(char &c){ sf("%c", &c); return *this; } ASDF& operator,(double &d){ sf("%lf", &d); return *this; } template<typename T> ASDF& operator,(T &a){ cin>>a; return *this; } }asdf; struct ASDFG{ template<typename T> ASDFG& operator,(vector<T> &v){ pf("["); cout<<v[0]; FOR(i, 1, SZ(v)){ cout<<", "<<v[i]; } pf("]"); return *this; } template<typename T> ASDFG& operator,(T x) { cout<<x<<" "; return *this; } }asdfg; //Header ends here #define MAXX 102 char str[MAXX]; int dp[MAXX][MAXX]; int len; int LCS(int i, int j) { if(i<0 || j>=len) return 0; int &ret = dp[i][j]; if(ret != -1) return ret; if(str[i] == str[j]) return ret = 1 + LCS(i-1, j+1); return ret = max(LCS(i-1, j), LCS(i, j+1)); } int main() { int kases, kaseno = 0; take(kases); while(kases--) { scanf("%s", str); len = strlen(str); mem(dp, -1); int res = 1<<29; for(int i=0; i<len-1; i++) { res = min(res, len+1 - 2*LCS(i, i)); res = min(res, len - 2*LCS(i, i+1)); } pf("Case %d: %d\n", ++kaseno, len==1?0:res); } }