use std::cmp::min; fn main() { let mut nm: String = String::new(); std::io::stdin().read_line(&mut nm).ok(); let nm: Vec = nm.trim().split_whitespace().map(|s| s.parse().unwrap()).collect(); let mut s: String = String::new(); std::io::stdin().read_line(&mut s).ok(); let s: Vec = s.trim().chars().collect(); let mut t: String = String::new(); std::io::stdin().read_line(&mut t).ok(); let t: Vec = t.trim().chars().collect(); let n: usize = nm[0]; let m: usize = nm[1]; const LIMIT: usize = 2000; let mut dp: Vec> = vec![vec![LIMIT; m+1]; n+1]; dp[0][0] = 0; for i in -1..(n as isize) { let s_char = if i >= 0 { s[i as usize] } else { 'X' }; for j in -1..(m as isize) { let t_char = if j >= 0 { t[j as usize] } else { 'X' }; if i == -1 && j == -1 { continue; } /* del: sから現在見ている1文字を削除 = sのindexを1すすめる ins: tで現在見ている1文字と同じ文字をsに追加する = tのindexを1すすめる upd: tで現在見ている1文字とsを同じ文字にする = s, tのindexを1すすめる */ if i >= 0 && j >= 0 { let ui = i as usize; let uj = j as usize; if s_char == t_char { dp[ui + 1][uj + 1] = min(dp[ui][uj], dp[ui+1][uj+1]); } else { dp[ui + 1][uj + 1] = min(dp[ui][uj] + 1, dp[ui+1][uj+1]); } } if i >= 0 { let ui = i as usize; let uj1 = (j+1) as usize; dp[ui+1][uj1] = min(dp[ui+1][uj1], dp[ui][uj1]+1); } if j >= 0 { let ui1 = (i+1) as usize; let uj = j as usize; dp[ui1][uj+1] = min(dp[ui1][uj+1], dp[ui1][uj] + 1); } } } println!("{}", dp[n][m]); }