# https://qiita.com/drken/items/a5e6fe22863b7992efdb # https://yukicoder.me/problems/no/225 # n m # s # t n, m = gets.split.map(&:to_i) s = gets.chomp t = gets.chomp # inf = [n, m].max + 1 inf = 9999 array_dp = Array.new(n+1) { Array.new(m+1, inf) } array_dp[0][0] = 0 n.times do |i| array_dp[i+1][0] = i+1 end m.times do |i| array_dp[0][i+1] = i+1 end n.times do |i| m.times do |j| if s[i] == t[j] array_dp[i+1][j+1] = [ array_dp[i][j], array_dp[i+1][j]+1, array_dp[i][j+1]+1 ].min else array_dp[i+1][j+1] = [ array_dp[i][j], array_dp[i+1][j], array_dp[i][j+1] ].min + 1 end end end puts array_dp[n][m]