NYOJ 36 &&HDU 1159 最长公共子序列(经典)

链接:click here

题意:tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。

输入
第一行给出一个整数N(0<N<100)表示待测数据组数

接下来每组数据两行,分别为待测的两组字符串。每个字符串长度不大于1000.

输出
每组测试数据输出一个整数,表示最长公共子序列长度。每组结果占一行。
样例输入
2
asdf
adfsd
123abc
abc123abc
样例输出
3
6

思路:引进一个二维数组dp[][],用dp[i][j]记录b[i]与d[j] 的LCS 的长度,b[i][j]记录dp[i][j]是通过哪一个子问题的值求得的,我们是自底向上进行递推计算,那么在计算dp[i,j]之前,dp[i-1][j-1],dp[i-1][j]与dp[i][j-1]均已计算出来。此时我们根据b[i]
= d[j]还是b[i] !=d[j],就可以计算出dp[i][j]。

代码:

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1010;
int dp[maxn][maxn];
char b[maxn],d[maxn];
int main()
{
    int ncase;
    scanf("%d",&ncase);
    while(ncase--)
    {
        cin>>b>>d;
        int b1=strlen(b);
        int d1=strlen(d);
        for(int j=0; j<b1; j++)
            for(int k=0; k<d1; k++)
            {
                if(b[j]==d[k])
                    dp[j+1][k+1]=dp[j][k]+1;
                else
                    dp[j+1][k+1]=max(dp[j+1][k],dp[j][k+1]);
            }
        cout<<dp[b1][d1]<<endl;
    }
    return 0;
}
时间: 2024-10-18 16:20:37

NYOJ 36 &&HDU 1159 最长公共子序列(经典)的相关文章

NYOJ 36 LCS(最长公共子序列)

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

HDU 1159 最长公共子序列(n*m)

Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 32693    Accepted Submission(s): 14786 Problem Description A subsequence of a given sequence is the given sequence with some el

HDU 1159 最长公共子序列

Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 53443    Accepted Submission(s): 24607 Problem Description A subsequence of a given sequence is the given sequence with some el

HDU 1243 最长公共子序列

反恐训练营 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 2850    Accepted Submission(s): 648 Problem Description 当今国际反恐形势很严峻,特别是美国“9.11事件”以后,国际恐怖势力更是有恃无恐,制造了多起骇人听闻的恐怖事件.基于此,各国都十分担心恐怖势力会对本国社会造成的不稳定,

hdu 1503 最长公共子序列

1 /* 2 给两个串a,b.输出一个最短的串(含等于a的子序列且含等于b的子序列) 3 */ 4 #include <iostream> 5 #include <cstdio> 6 #include <cstring> 7 using namespace std; 8 9 const int maxn=105; 10 int dp[maxn][maxn],path[maxn][maxn]; 11 int len,len1,len2; 12 char text[maxn

hdoj 1159最长公共子序列

?? /*Common Subsequence A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exist

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

题目链接: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): 37551    Accepted Submission(s): 17206 Problem Description A subsequence of

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

hdu 1159 common sequence (最长公共子序列 dp)

http://acm.hdu.edu.cn/showproblem.php?pid=1159 题意 : 给出两个字符串 求出最长公共子序列 思路: if(str1[i]==str2[j]) { dp[i][j]=max(dp[i-1][j-1]+1,max(dp[i-1][j],dp[i][j-1])); } else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); #include<cstdio> #include<cstring> #include&l