题解 | #最长公共子序列(一)#
最长公共子序列(一)
https://www.nowcoder.com/practice/672ab5e541c64e4b9d11f66011059498
动态规划
定义dp[i][j] 为0-i-1 与 0-j-1 的最长公共子序列的长度
如果当前i与j的字符相等那么就可以连接i-1与j-1的最长公共子序列
状态转移:dp[i][j] = dp[i-1][j-1]
如果当前i与j字符不相等 说明以ij结尾的最长公共子序列只会在 i-1与j 和 i与j-1中取最大值
状态转移:dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1])
import java.util.Scanner;
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
//dp[i][j] : 0-i-1与 0-j-1的最长公共子序列长度
//状态转移 如果当前字符相等 dp[i][j] = dp[i-1][j-1]+1;
// 如果当前字符不想等 dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
int[][] dp = new int[n+1][m+1];
String s1 = sc.next();
String s2 = sc.next();
for(int i = 1;i<=n;i++){
for(int j = 1;j<=m;j++){
if(s1.charAt(i-1)==s2.charAt(j-1)){
dp[i][j] = dp[i-1][j-1]+1;
}else{
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
}
}
}
System.out.println(dp[n][m]);
}
}
查看21道真题和解析