51nod_1006 最长公共子序列,输出路径【DP】

题意:

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

比如两个串为:

abcicba

abdkscab

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

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

思路:

DP,同时DP记录路径。

代码:

string a,b;
int f[1005][1005];
int path[1005][1005];

void _print(int x,int y){
    if(!x||!y) ret;

    int t=path[x][y];
    if(!t)
        _print(x-1,y-1);
    else if(t<0)
        _print(x-1,y);
    else
        _print(x,y-1);
    if(!t) print("%c",a[x-1]);
}

int main(){

    cin>>a>>b;
    int la=a.length(), lb=b.length();
    mem(f,0);
    mem(path,0);

    rep(i,1,la) rep(j,1,lb){
        f[i][j]=max( f[i-1][j],f[i][j-1] );
        if(f[i-1][j]>f[i][j-1]){
            f[i][j]=f[i-1][j];
            path[i][j]=-1;
        }
        else{
            f[i][j]=f[i][j-1];
            path[i][j]=1;
        }
        if(a[i-1]==b[j-1]){
            if(f[i-1][j-1]+1>f[i][j]){
                f[i][j]=f[i-1][j-1]+1;
                path[i][j]=0;
            }
        }
    }
    _print(la,lb); cout<<endl;

    return 0;
}
时间: 2024-07-30 23:45:12

51nod_1006 最长公共子序列,输出路径【DP】的相关文章

最长公共子序列 LCS 递归 dp 51Nod 1006

给出两个字符串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 先用dp 找到最大值,且标记路径,然后递归 从终点走到起点,然后输

最长公共子序列——输出

首先我不得不说这道题很傻逼....你要先求公共子序列的长度......然后去DFS一遍注意要倒着搜......公共子序列也要倒着找..........我做了好久,代码: #include<bits/stdc++.h> using namespace std; char a[1001],b[1001]; int dp[1001][1001]={0}; int n1,n2,sum=0; int ans[1001]={0}; int a1[1001][101],b1[1001][101]; int

nyoj-36-最长公共子序列

http://acm.nyist.net/JudgeOnline/problem.php?pid=36 最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则

POJ 1458 Common Subsequence(最长公共子序列LCS)

POJ1458 Common Subsequence(最长公共子序列LCS) http://poj.org/problem?id=1458 题意: 给你两个字符串, 要你求出两个字符串的最长公共子序列长度. 分析: 本题不用输出子序列,非常easy,直接处理就可以. 首先令dp[i][j]==x表示A串的前i个字符和B串的前j个字符的最长公共子序列长度为x. 初始化: dp全为0. 状态转移: IfA[i]==B[j] then dp[i][j]= dp[i-1][j-1]+1 else dp[

[2016-05-09][51nod][1006 最长公共子序列Lcs]

时间:2016-05-09 21:12:54 星期一 题目编号:[2016-05-09][51nod][1006 最长公共子序列Lcs] 题目大意:[2016-05-09][51nod][1006 最长公共子序列Lcs].md 分析:动态规划 dp[i][j] 表示字符串A以第i个位置 ,字符串B以第j个位置的最长公共子序列的长度 dp[i][j] = dp[i - 1][j - 1] + 1 if a[i] == a[j] else dp[i][j] == max(dp[i - 1][j] ,

POJ 2264 Advanced Fruits(最长公共子序列)

这题要用到最长公共子序列,又是DP,可是不会,于是就去学这个,看了一会儿,终于有点心得了. 主体思想就是先求出最长公共子序列,然后把公共字符之前的所有字符都合并起来.具体请看下面的注释. #include<cstdio> #include<cstring> const int N=105; char s1[N],s2[N],s[N*2]; int lcs[N][N],index1[N],index2[N];//index和index2是用来记录公共字符所在的索引. void get

最长公共子序列Lcs(打印路径)

给出两个字符串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 #include <bits/stdc++.h> usin

最长公共子序列 DP

算法老师的作业,一道dp基础题,给你两个序列,问你最长公共子序列是什么,比如:(a,b)是(a,c,d,b)的子序列.注意不是最长公共子串,这里的子序列可以不连续. 两个for循环就出来了,每一个dp[i][j]可以从dp[i-1][j-1].dp[i-1][j].dp[i][j-1]三种情况更新过来,取个最大的,然后把路径用123存下来,最后再顺着路径找然后逆序输出就行. sample input: 7 4 A B C B D A B B C D B 7 6 A B C B D A B B D

hdu 1159 Common Subsequence(最长公共子序列 DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 25416    Accepted Submission(s): 11276 Problem Description A subsequence of