问题分析:
dp[i][j]:s1 ,s2,…,si和t1,t2,…,tj对应的最长公共子序列
因此,对于s1 ,s2,…,si,s(i+1)和t1,t2,…,tj,t(j+1)对应的最长公共子序列是:
当s(i+1) == t(j+1)时,在s1 ,s2,…,si和t1,t2,…,tj的最长公共子序列加上s(i+1)或t(j+1)
s1 ,s2,…,si和t1,t2,…,tj,t(j+1)的最长公共子序列
s1 ,s2,…,si,s(i+1)和t1,t2,…,tj的最长公共子序列
递推公式:
代码:
import java.util.*;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
char[] s = new char[n];
char[] t = new char[m];
String s1 = sc.next();
for(int i = 0;i < n;i++) {
s[i] = s1.charAt(i);
}
sc.nextLine();
String s2 = sc.next();
for(int j = 0;j < m;j++) {
t[j] = s2.charAt(j);
}
sc.close();
int[][] dp = new int[n+1][m+1];
for(int i = 0;i < n;i++) {
for(int j = 0;j < m;j++) {
if(s[i] == t[j]) {
dp[i+1][j+1] = dp[i][j] +1;
}
else {
dp[i+1][j+1] = Math.max(dp[i+1][j], dp[i][j+1]);
}
}
}
System.out.println(dp[n][m]);
}
}