SSL_1463--公共子串(动规练习题)

来源:互联网 发布:网络排错大讲解 编辑:程序博客网 时间:2024/06/06 05:26

Description

设有A、B两个字符串,找出A、B共同子串,每个字符串无相同字符,可以不连续,但顺序不能颠倒。

Input

第一行字符串A
第二行字符串B

Output

最长公共子串的长度.

Sample Input

abcfbcabfcab

Sample Output

4

思路

用f[n][m]表示长度为n和m的公共子串的最长的长度

当a[i]!=b[j]时 f[i][j]=max(f[i-1][j],f[i][j-1];

当a[i]=b[j]时 f[i][j]=max(f[i][j],f[i-1][j-1]+1);

代码

#include<cstdio>#include<cstring>#define len strlen#define r(i,a,b) for (int i=a;i<=b;i++)using namespace std;char a[201],b[201];int f[201][201];int n,m;int max(int x,int y){return x>y?x:y;}int main(){gets(a);gets(b);//输入n=len(a);m=len(b);r(i,1,n) r(j,1,m)  {   f[i][j]=max(f[i-1][j],f[i][j-1]);   if (a[i-1]==b[j-1]) f[i][j]=max(f[i][j],f[i-1][j-1]+1);//这里减一是因为C++是从第0位开始的  }printf("%d",f[n][m]);}