动态规划真的懂了呀系列《线性DP:最长公共子序列》

56 阅读1分钟

价值:记录学习过程的思考,本身就是一场动态规划的前生,记忆化搜索。

线性DP:最长公共子序列,讨论右边界相同(上层+1)、不同( i 行满足或者 j 行满足)取max

线性DP,讨论右边界,每次对右边界的一个字符讨论,组合最优子结构

                //对右边的一个字符进行讨论,如果相同==>加入最优解中
                if(c1 == c2){
                    dp[i][j] = dp[i-1][j-1] + 1;
                }
                else
                {
                    //不同进行分类讨论
                    //如果i行是最优解的一部分
                    //如果j行是最优的一部分
                    //取max==》满足最优解定义
                    dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
                }
public int longestCommonSubsequence(String text1, String text2) {
        int n = text1.length();
        int m = text2.length();

        int[][] dp = new int[n+1][m+1];
        for(int i = 1; i<=n;i++){
            char c1 = text1.charAt(i-1);
            for(int j = 1;j<=m;j++){
                char c2 = text2.charAt(j-1);

                //对右边的一个字符进行讨论,如果相同==》加入最有解中
                if(c1 == c2){
                    dp[i][j] = dp[i-1][j-1] + 1;
                }
                else
                {
                    //不同进行分类讨论
                    //如果i行是最优解的一部分
                    //如果j行是最优的一部分
                    //取max==》满足最优解定义
                    dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        return dp[n][m];
    }