题解 | #最长公共子序列(一)#

最长公共子序列(一)

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]);
    }
}

全部评论

相关推荐

船长想实习:我啥技术不会决定去试试,然后进去也不干活就搅局可以吗?
点赞 评论 收藏
分享
牛客49269852...:这家公司纯神人公司来的,约的我今早11点线下面试,我人都到了,10点和我说改线上,无敌
找实习记录
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务