nyoj-36-最长公共子序列

http://acm.nyist.net/JudgeOnline/problem.php?pid=36

最长公共子序列

时间限制:3000 ms  |  内存限制:65535 KB

难度:3

描述
咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列。
tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。
输入
第一行给出一个整数N(0<N<100)表示待测数据组数
接下来每组数据两行,分别为待测的两组字符串。每个字符串长度不大于1000.
输出
每组测试数据输出一个整数,表示最长公共子序列长度。每组结果占一行。
样例输入
2 asdf adfsd 123abc abc123abc
样例输出
3 6

解题思路:求最长公共子序列,经典DP,详情请看代码=-=

1 #include <iostream>
 2 #include <algorithm>
 3 #include <stdlib.h>
 4 #include <math.h>
 5 #include <string.h>
 6 
 7 using namespace std;
 8 
 9 const int MAXN = 1010;
10 
11 //输入
12 char s[MAXN], t[MAXN];
13 //dp数组
14 int dp[MAXN][MAXN];
15 
16 void solve(){
17     int n, m;
18     n = strlen(s);
19     m = strlen(t);
20     memset(dp, 0, sizeof(dp));
21     for(int i = 0; i < n; i++){
22         for(int j = 0; j < m; j++){
23             if(s[i] == t[j]){
24                 dp[i + 1][j + 1] = dp[i][j] + 1;
25             }
26             else{
27                 dp[i + 1][j + 1] = max(dp[i + 1][j], dp[i][j + 1]);
28             }
29         }
30     }
31     cout << dp[n][m] << endl;
32 }
33 
34 int main(){
35     int T;
36     cin >> T;
37     while(T--){
38         cin >> s >> t;
39         solve();
40     }
41     return 0;

42 }

时间: 2024-12-19 19:54:45

nyoj-36-最长公共子序列的相关文章

nyoj 36 最长公共子序列 【DP】

今天听了老师讲的最长公共子序列,就拿以前做过的题又做了一遍... 我用的是最简单普通的方法, 代码: #include<stdio.h> #include<string.h> #include<algorithm> using namespace std; int dp[1005][1005]; int main() { char a[1005], b[1005]; int t; scanf("%d", &t); while(t --){ s

NYOJ 36 最长公共子序列 (还是dp)

这个好多算法书上都有,不仅限于<算法导论> 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描写叙述 咱们就不拐弯抹角了,如题.须要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence). 其定义是.一个序列 S ,假设各自是两个或多个已知序列的子序列,且是全部符合此条件序列中最长的.则 S 称为已知序列的最长公共子序列. 输入 第一行给出一个整数N(0

nyist oj 36 最长公共子序列 (动态规划基础题)

最长公共子序列 时间限制:3000 ms  |  内存限制:65535 KB 难度:3 描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列. tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列. 输入 第一行给出一个整数N(0<N<100)表示待测数据组数 接

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

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

nyoj36-最长公共子序列 (LCS)

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

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

链接:click here 题意:tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列. 输入 第一行给出一个整数N(0<N<100)表示待测数据组数 接下来每组数据两行,分别为待测的两组字符串.每个字符串长度不大于1000. 输出 每组测试数据输出一个整数,表示最长公共子序列长度.每组

最长公共子序列的代码实现

关于最长公共子序列(LCS)的相关知识,http://blog.csdn.net/liufeng_king/article/details/8500084 这篇文章讲的比较好,在此暂时不再详说. 以下是我代码实现两种方式:递归+递推: 1 #include <bits/stdc++.h> 2 using namespace std; 3 int A[100]; 4 int B[100]; 5 6 //int B[]={2,3,5,6,9,8,4}; 7 int d[100][100]={0};

Longest Common Substring(最长公共子序列)

Longest Common Substring Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 37 Accepted Submission(s): 28   Problem Description Given two strings, you have to tell the length of the Longest Common Su

经典dp 最长公共子序列

首先,说明一下子序列的定义…… 一个序列A={a1,a2,a3,...,an},从中删除任意若干项,剩余的序列叫A的一个子序列. 很明显(并不明显……),子序列……并不需要元素是连续的……(一开始的时候思维总是以为元素是连续的,好傻啊……) 然后是公共子序列…… 如果C是A的子序列,也是B的子序列,那么C是A和B的公共子序列…… 公共子序列一般不止一个,最长的那个就是最长公共子序列,当然也可能不止一个…… 煮个栗子…… A={1,3,6,9,5,4,8,7},B={1,6,3,4,5,7} {1