//#define _GLIBCXX_DEBUG #include #define rep(i, n) for(int i=0; i; using vs = vector; using vi = vector; using vvi = vector; template using PQ = priority_queue; template using PQG = priority_queue, greater >; const int INF = 0xccccccc; const ll LINF = 922337203685477580LL; template inline bool chmax(T1 &a, T2 b) {return a < b && (a = b, true);} template inline bool chmin(T1 &a, T2 b) {return a > b && (a = b, true);} template istream &operator>>(istream &is, pair &p) { return is >> p.first >> p.second;} template ostream &operator<<(ostream &os, const pair &p) { return os << p.first << ' ' << p.second;} const int N = 1e3+10; //head int n, m; string s, t; int dp[N][N]; int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n >> m; cin >> s >> t; rep(i, n+1) fill(dp[i], dp[i]+m+1, INF); dp[0][0] = 0; rep(i, n+1) rep(j, m+1) { if(i < n and j < m) { if(s[i] == t[j]) chmin(dp[i+1][j+1], dp[i][j]); else chmin(dp[i+1][j+1], dp[i][j]+1); } if(i < n) chmin(dp[i+1][j], dp[i][j]+1); if(j < m) chmin(dp[i][j+1], dp[i][j]+1); //cout << dp[i][j] << ' ' << i << ' ' << j << endl; } //rep(i, n+1) rep(j, m+1) cout << dp[i][j] << (j == m?'\n':' '); cout << dp[n][m] << endl; }