51nod 1006 最长公共子序列 Lcs(传说中的简单题 dp + 记录路径)

 

                                                     1006 最长公共子序列Lcs 

                            基准时间限制:1 秒                 空间限制:131072 KB        分值: 0           难度:基础题

 

Problem Description:

给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。

比如两个串为:

abcicba

abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。

Input

第1行:字符串A
第2行:字符串B
(A,B的长度 <= 1000)

Output

输出最长的子序列,如果有多个,随意输出1个。

Input示例

abcicba
abdkscab

Output示例

abca

 

 

思路: 正常的LCS + 记录路径就好了

废话不多说直接上代码:

 

AC代码:

#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <string.h>
#include <string>
#include <vector>
#include <queue>
#include <stack>
#include <map>
#include <set>
using namespace std;
typedef long long ll;
#define MAXN 1000 + 10

int dp[MAXN][MAXN], vis[MAXN][MAXN];
char s1[MAXN], s2[MAXN], ans[MAXN];
int cnt = 0;
void path(int i, int j)//定一个函数从最后到开头找所走的路径
{
    while(i > 0 && j > 0)
    {
        if(vis[i][j] == 0)
        {
            ans[cnt++] = s1[i - 1];
            j--; i--;
        }
        else if(vis[i][j] == 1)
        {
            j--;
        }
        else
            i--;
    }
}
int main()
{
    int k = 0;
    memset(dp, 0, sizeof(dp));
    scanf("%s%s", s1, s2);
    int len1 = strlen(s1), len2 = strlen(s2);
    for(int i = 1; i <= len1; i++)
    {
        for(int j = 1; j <= len2; j++)
        {
            if(s1[i - 1] == s2[j -1])
            {
                dp[i][j] = dp[i - 1][j - 1] + 1;
                vis[i][j] = 0;//来自左上方的
            }
            else
            {
                if (dp[i - 1][j] < dp[i][j - 1])
                {
                    dp[i][j] = dp[i][j - 1];
                    vis[i][j] = 1;//来自左边
                }
                else
                {
                    dp[i][j] = dp[i - 1][j];
                    vis[i][j] = -1;//来自上边
                }
            }

        }
    }
    path(len1, len2);
    for(int i = cnt - 1; i >= 0; i--)//倒序输出
        printf("%c", ans[i]);
    printf("\n");
    return 0;
}

 

 

 

       我喜欢程序员,他们单纯、固执、容易体会到成就感; 
       面对压力,能够挑灯夜战不眠不休; 
       面对困难,能够迎难而上挑战自我。 
       他们也会感到困惑与傍徨,但每个程序员的心中都有一个比尔盖茨或是乔布斯的梦想“用智慧开创属于自己的事业”。 
       我想说的是,其实我是一只程序猿* 
                                                                                    –唐尤华

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值