zoukankan      html  css  js  c++  java
  • 最长公共子序列(动态规划)

    求两个字符串的最长公共子序列

    创建dp数组

    边界条件如图所示,dp[i][0] = dp[0][j] = 0

    之后根据状态转移方程求出整个二维数组的值

    ①当A[i] == B[j]  时,则字符串A和字符串B的最长公共子序列增加了一位,即dp[i][j] = dp[i-1][j-1] + 1;

    ②当A[i] != B[i] 时,则字符串A和字符串B的最长公共子序列无法延长,则继承 dp[i-1][j] 和 dp[i][j-1] 中最大的一位

    最终填充完毕

    #include<iostream>
    #include<string>
    using namespace std;
    //const int maxn = 1000;
    int main()
    {
        string str1;
        string str2;
        int dp[100][100] = {0};
        while(cin>>str1>>str2)
        {
            int len1 = str1.length();
            int len2 = str2.length();
            //初始化边界条件
            for(int i=0;i<=len1;i++)
                dp[i][0] = 0;
            for(int j=0;j<=len2;j++)
                dp[0][j] = 0;
            //利用状态转移方程计算dp,
            for(int i = 1;i<=len1;i++)
            {
                for(int j=1;j<=len2;j++)
                {
                    if(str1[i-1] == str2[j-1])
                        dp[i][j] = dp[i-1][j-1] + 1;
                    else
                        dp[i][j] = max(dp[i][j-1],dp[i-1][j]);
                }
            }
            cout<<dp[len1][len2]<<endl;
        }
        return 0;
    }

     参考博客:https://blog.csdn.net/someone_and_anyone/article/details/81044153

  • 相关阅读:
    并查集
    关于一些位运算的小记
    用ST解决RMQ问题
    寒假作业_4
    H
    卢卡斯 组合数
    并查集
    G
    F
    E
  • 原文地址:https://www.cnblogs.com/ttzz/p/10584574.html
Copyright © 2011-2022 走看看