AcWing 897. 【Java】最长公共子序列
原题链接
简单
作者:
tt2767
,
2020-03-05 22:52:13
,
所有人可见
,
阅读 515
/*
1. 状态定义: 是A的子序列又是B的子序列的字符串长度最长是多少 -> f[i][j] 由A[1~i] 和 B[1~j] 字母组成的子序列的最大长度
2. 状态计算: 以最后一个位置划分, 为 4种情况:
都不选 = f[i-1][j-1]
选A[i] = f[i][j-1] + 1
选B[j] = f[i-1][j] + 1
都选 = f[i-1][j-1] + 1
3. 边界: f[~][~] = 0
*/
import java.util.*;
public class Main{
void run(){
int n = jin.nextInt();
int m = jin.nextInt();
String stringA = jin.next();
String stringB = jin.next();
int[][] f = new int[n+1][m+1];
for (int i = 1; i <= n ; i ++){
for (int j = 1; j <= m; j ++){
f[i][j] = f[i-1][j-1];
f[i][j] = Math.max(f[i][j], f[i-1][j]);
f[i][j] = Math.max(f[i][j], f[i][j-1]);
if (stringA.charAt(i-1) == stringB.charAt(j-1)) f[i][j] = Math.max(f[i][j], f[i-1][j-1] + 1);
}
}
int res = f[n][m];
System.out.println(res);
}
private Scanner jin = new Scanner(System.in);
public static void main(String[] args) {new Main().run();}
}