题目链接:http://blog.csdn.net/u014361775/article/details/42873875
题目解析:
给定两行字符串序列,输出它们之间最大公共子单词的个数
对于给的两个序列X 和 Y,用i 和 j分别作为它们的前缀指针,f[i][j]表示序列X的前缀Xi 和 序列Y的前缀Yi 的最长公共子序列的长度,在这道题中,可把每一个单词当作一个字符来进行比较。
当 i | j 为0时 ,此 f[i][j] = 0;
当 i!=0 && j!=0 && Xi==Yi 时 f[i][j] = f[i-1][j-1] + 1;
当 i!=0 && j!=0 && Xi!=Yi 时 f[i][j] = max ( f[i-1][j] + f[i][j-1] );
以上是对最长公共子序列的求法。
我这题做了一下午,因为不会使用C++里面的函数,所以我用C语言写的,总是出现错误,之后错误没有了交上去却一直WA,后来一看题解才知道,字符串里面包括数字,坑啊,
改完后交时,UVA却崩了,等了两个多小时才交上,坎坷AC路。
代码:
#include <iostream> #include <string.h> #include <stdio.h> #include <algorithm> #include <math.h> using namespace std; char str[20100],st2[20100]; char a[1002][22],b[1002][22]; int f[1002][1002]; int main() { int K=0,tt=0,l,t,t2,l2,ff; while(gets(str)!=NULL) { tt=0; t2=0; t=0; gets(st2); ff=0; l=strlen(str); l2=strlen(st2); for(int i=0; i<l; i++) { if((str[i]>='A'&&str[i]<='Z')||(str[i]>='a'&&str[i]<='z')||(str[i]>='0'&&str[i]<='9')) { a[tt][t++]=str[i]; ff=1; } else { if(t) { a[tt][t]='