前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >动态规划经典算法--最长公共子序列 LCS

动态规划经典算法--最长公共子序列 LCS

作者头像
风骨散人Chiam
发布2020-10-28 10:43:43
3070
发布2020-10-28 10:43:43
举报
文章被收录于专栏:CSDN旧文CSDN旧文

转移方程

在这里插入图片描述
在这里插入图片描述

代码:

代码语言:javascript
复制
//法一:
#include <bits/stdc++.h>
using namespace std;
//---------------https://lunatic.blog.csdn.net/-------------------//
int dp[100][100];
string s[100][100];
int main()
{
    string a, b;
    cin >> a >> b;
    dp[0][0] = 0;
    memset(dp, 0, sizeof(dp));
    for (int i = 0; i < a.size(); i++)
        for (int j = 0; j < b.size(); j++)
        {

            if (a[i] == b[j])
            {
                dp[i + 1][j + 1] = dp[i][j] + 1;
                s[i + 1][j + 1] = s[i][j] + a[i];
            }
            else
            {
                if (dp[i + 1][j] > dp[i + 1][j])
                {
                    dp[i + 1][j + 1] = dp[i + 1][j];
                    s[i + 1][j + 1] = s[i+1][j] ;
                }
                else 
                {
                     dp[i + 1][j + 1] = dp[i][j+1];
                    s[i + 1][j + 1] = s[i][j+1]  ;
                }
            }
        }
        cout<<dp[a.size()][b.size()]<<endl;
        cout<<s[a.size()][b.size()];
}
代码语言:javascript
复制
//法二:
#include <bits/stdc++.h>
using namespace std;
//---------------https://lunatic.blog.csdn.net/-------------------//
string a, b;
int dp[100][100];
int c[100][100];
void printAns(int i, int j)
{

    if (i == -1 || j == -1)
        return;
    if (c[i][j] == 0)
    {
        printAns(i - 1, j - 1);
        cout << a[i];
    }
    else if (c[i][j] == 1)
        printAns(i, j - 1);
    else
        printAns(i - 1, j);
}
int main()
{

    cin >> a >> b;
    dp[0][0] = 0;
    for (int i = 0; i < a.size(); i++)
        for (int j = 0; j < b.size(); j++)
        {

            if (a[i] == b[j])
            {
                dp[i + 1][j + 1] = dp[i][j] + 1;
                c[i][j] = 0; //代表相等
            }
            else
            {
                if (dp[i + 1][j] > dp[i + 1][j])
                {
                    dp[i + 1][j + 1] = dp[i + 1][j];
                    c[i][j] = 1; //代表不相等,从上面的不相等
                }
                else
                {
                    dp[i + 1][j + 1] = dp[i][j + 1];
                    c[i][j] = -1; //代表不相等,从左面的不相等
                }
            }
        }
    cout << dp[a.size()][b.size()] << endl;
    printAns(a.size() - 1, b.size() - 1);
    cout << endl;
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-03-25 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档