/*LCS。
f[i][j] = f[i-1][j-1] if x[i] = y[j]
= max{f[i-1][j],f[i][j-1]} if x[i]!=y[i]
*/
#include<stdio.h>
#include<string.h>
#define N 1005
char s1[N],s2[N];
int f[N][N];
int LCS()
{
int i,j;
int n = strlen(s1); //把这个写在循环里面了,直接超时
int m = strlen(s2);
memset(f,0,sizeof(f));
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if (s1[i-1]==s2[j-1])
f[i][j] = f[i-1][j-1]+1;
else if(f[i-1][j]>=f[i][j-1])
f[i][j] = f[i-1][j];
else f[i][j] = f[i][j-1];
}
}
return f[i-1][j-1];
}
int main()
{
int t;
scanf("%d",&t);
getchar();
while(t--)
{
scanf("%s",s1);
getchar();
scanf("%s",s2);
printf("%d\n",LCS());
}
return 0;
}
NYOJ-36:最长公共子序列
最新推荐文章于 2019-05-18 09:34:50 发布