问题 F: P1050
时间限制: 1 Sec 内存限制: 128 MB提交: 37 解决: 27
[提交][状态][讨论版]
题目描述
一个字符串A的子串被定义成从A中顺次选出若干个字符构成的串。如A=“cdaad" ,顺次选1,3,5个字符就构成子串" cad" ,现给定两个字符串,求它们的最长共公子串。
输入
第一行两个字符串用空格分开。
输出
最长子串的长度。
样例输入
abccd aecd
样例输出
3
提示
两个串的长度均小于2000
我是比较服的一道模板LCS题,题目名字高深,看不出,服了。。
没什么好说的LCS,O(nm)复杂度
#include<iostream> #include<algorithm> #include<cmath> #include<cstring> #include<string> const int MAXN=2007; using namespace std; char s1[MAXN],s2[MAXN]; int dp[MAXN][MAXN]; int main() { 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++) { dp[i][j]=max(dp[i-1][j],dp[i][j-1]); if (s1[i-1]==s2[j-1]) dp[i][j]=max(dp[i-1][j-1]+1,dp[i][j]); } printf("%d",dp[len1][len2]); }