AcWing 897. 最长公共子序列-代码注释-golang
原题链接
简单
作者:
望哥
,
2020-07-24 16:52:48
,
所有人可见
,
阅读 576
package main
import (
"bufio"
"fmt"
"os"
)
const (
N = 1010
)
var dp [N][N]int
var reader = bufio.NewReader(os.Stdin)
var writer = bufio.NewWriter(os.Stdout)
var n,m int
func max(a,b int)int{
if a>b{
return a
}
return b
}
func main() {
fmt.Fscan(reader, &n,&m)
var a,b string
fmt.Fscan(reader, &a, &b)
// **最长公共子序列**: a, b 两个序列, `dp[i][j]` 表示a序列中前i个字符和b序列中前j个字符中共同存在的最长子序列长度。
// - 如果 `a[i] = b[j]`, 则 `dp[i][j] = dp[i-1][j-1] + 1`
// - 如果 `a[i] != b[j]`, 则 `dp[i][j] = max(d[i-1][j], d[i][j-1])` , 其中 `d[i-1][j]`, `d[i][j-1]` 为 `dp[i][j]`的前置状态.
for i := 1; i <= n; i++ {
for j:=1;j<=m;j++{
if a[i-1] == b[j-1] {
dp[i][j] = dp[i-1][j-1] + 1
}else{
dp[i][j] = max(dp[i-1][j], dp[i][j-1])
}
}
}
fmt.Println(dp[n][m])
}