```go
package main
import (
"bufio"
"fmt"
"os"
)
func max(a, b int32) int32 {
if a > b {
return a
}
return b
}
func main() {
in := bufio.NewReader(os.Stdin)
var n, m int
fmt.Fscan(in, &n, &m)
var A, B string
fmt.Fscan(in, &A)
fmt.Fscan(in, &B)
AA := []byte(A)
BB := []byte(B)
const INF int32 = 1000000000
total := (n + 1) * (m + 1) * 3 * 3
dp := make([]int32, total)
for i := 0; i < total; i++ {
dp[i] = -INF
}
idx := func(i, j, s1, s2 int) int {
return ((i*(m+1) + j)*3 + s1)*3 + s2
}
dp[idx(0, 0, 0, 0)] = 0
for i := 0; i <= n; i++ {
for j := 0; j <= m; j++ {
for s1 := 0; s1 < 3; s1++ {
for s2 := 0; s2 < 3; s2++ {
k := idx(i, j, s1, s2)
curr := dp[k]
if curr == -INF {
continue
}
if i < n {
if s1 == 0 {
kk := idx(i+1, j, 0, s2)
dp[kk] = max(dp[kk], curr+0)
kk = idx(i+1, j, 1, s2)
dp[kk] = max(dp[kk], curr-1)
} else if s1 == 1 {
kk := idx(i+1, j, 1, s2)
dp[kk] = max(dp[kk], curr-1)
kk = idx(i+1, j, 2, s2)
dp[kk] = max(dp[kk], curr+0)
} else if s1 == 2 {
kk := idx(i+1, j, 2, s2)
dp[kk] = max(dp[kk], curr+0)
}
}
if j < m {
if s2 == 0 {
kk := idx(i, j+1, s1, 0)
dp[kk] = max(dp[kk], curr+0)
kk = idx(i, j+1, s1, 1)
dp[kk] = max(dp[kk], curr-1)
} else if s2 == 1 {
kk := idx(i, j+1, s1, 1)
dp[kk] = max(dp[kk], curr-1)
kk = idx(i, j+1, s1, 2)
dp[kk] = max(dp[kk], curr+0)
} else if s2 == 2 {
kk := idx(i, j+1, s1, 2)
dp[kk] = max(dp[kk], curr+0)
}
}
if i < n && j < m && AA[i] == BB[j] {
canA := (s1 == 0 || s1 == 1)
canB := (s2 == 0 || s2 == 1)
if canA && canB {
ns1 := 1
ns2 := 1
kk := idx(i+1, j+1, ns1, ns2)
dp[kk] = max(dp[kk], curr+2)
}
}
}
}
}
}
var ans int32 = -INF
for s1 := 0; s1 < 3; s1++ {
for s2 := 0; s2 < 3; s2++ {
ans = max(ans, dp[idx(n, m, s1, s2)])
}
}
fmt.Println(ans)
}
```