SRM497 Div2 Hard(1000) MakeSquare

MakeSquare

min{編集距離(S[0..i],S[i+1..n-1])}

#include <string>
#include <vector>
using namespace std;

//  編集距離
int editdistance( string a, string b )
{
    int n=(int)a.length();
    int m=(int)b.length();
    vector<vector<int> >T(n+1,vector<int>(m+1));
    for(int i=0;i<=n;i++)T[i][0]=i;
    for(int j=0;j<=m;j++)T[0][j]=j;
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
        T[i][j]=min(T[i][j-1],min(T[i-1][j],T[i-1][j-1]-(a[i-1]==b[j-1])))+1;
    return T[n][m];
}

class MakeSquare{public:
int minChanges( string S )
{
    int n = (int)S.length();
    int ans = n;
    for ( int i=0; i<=n; i++ )
        ans = min( ans, editdistance(S.substr(0,i),S.substr(i,n-i)) );
    return ans;
}};