题目36:最长公共子序列
来源:互联网 发布:ios 网络权限 编辑:程序博客网 时间:2024/06/05 17:15
题目链接:
http://acm.nyist.net/JudgeOnline/problem.php?pid=36
描述
咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列。
tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence)。其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列。
输入
第一行给出一个整数N(0<N<100)表示待测数据组数
接下来每组数据两行,分别为待测的两组字符串。每个字符串长度不大于1000.
输出
每组测试数据输出一个整数,表示最长公共子序列长度。每组结果占一行。
样例输入
2asdf
adfsd
123abc
abc123abc
样例输出
36
算法思想:
动态规划算法。
递推公式如下:
如:asdf
adfsd
填表过程如下所示:
源代码
#include <iostream>#include <string>#include <algorithm>#include <cstring>using namespace std;string str1, str2;int len1, len2;int f[1001][1001];int dp(int i,int j){ for (int i = 0; i < len1; i++) { for (int j = 0; j < len2; j++) { if (str1[i] == str2[j] && i >= 1 && j >= 1) { f[i][j] = f[i - 1][j - 1] + 1; } else if (str1[i] == str2[j]) { f[i][j] = 1; } else if (i >= 1 && j >= 1) { f[i][j] = max(f[i - 1][j], f[i][j - 1]); } else if (i >= 1) { f[i][j] = f[i - 1][j]; } else if (j >= 1) { f[i][j] = f[i][j - 1]; } } } return f[len1 - 1][len2 - 1];}int main(){ int N, ans; cin >> N; while (N--) { for (int i = 0; i < 1001; i++) { memset(f[i], 0, 1001); } cin >> str1 >> str2; len1 = str1.length(); len2 = str2.length(); cout << dp(0, 0)<<endl; } return 0;}
最优源代码
#include <stdio.h>#include <string.h>char s1[1001], s2[1001];int dp[1001], t, old, tmp;int main(){ scanf("%d", &t); getchar(); while(t--){ gets(s1); gets(s2); memset(dp, 0, sizeof(dp)); int lenS1=strlen(s1), lenS2=strlen(s2); for(int i=0; i<lenS1; i++){ old=0; //若s1[i]==s2[j], dp[i][j] = dp[i-1][j-1]+1 //否则,dp[i][j] = max(dp[i-1][j], dp[i][j-1]) //此处进行了空间优化,old 代表 dp[i-1][j-1] //dp[j-1] 代表 dp[i][j-1], dp[j] 代表 dp[i-1][j] for(int j=0; j<lenS2; j++){ tmp = dp[j]; if(s1[i]==s2[j]) dp[j] = old+1; else if(dp[j-1]>dp[j])dp[j]=dp[j-1]; old = tmp; } } printf("%d\n", dp[lenS2-1]); } return 0;}
算法复杂度:
由源代码可知,算法时间复杂度为O(len1 * len2).
阅读全文
0 0
- 题目36:最长公共子序列
- 南阳理工OJ_题目36 最长公共子序列
- NYOJ 题目36 最长公共子序列(动态规划)
- NYOJ--36(动态规划)-题目----------------------------- 最长公共子序列
- 题目1042:Coincidence(最长公共子序列)
- 36 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列...
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- 最长公共子序列
- h5app上传图片
- [bzoj1002] [FJOI2007]轮状病毒
- Ubuntu “软件包 libpython3.5-dev 需要重新安装,但是我无法找到相应的安装文件”的问题
- Server returned HTTP response code: 500 for URL:
- url中&、?、#的区别
- 题目36:最长公共子序列
- java 使用keytool将pem证书导入到cacerts中
- 类redis的“轮子”知多少
- 机器学习、深度学习、计算机视觉、自然语言处理及应用案例——干货分享
- python爬虫爬取糗事百科的段子
- 输入剩余字数
- Java中的阻塞队列
- P4243【ZJOI2007】时态同步
- spark上安装graphframes