詳細的演算法可以看這裡。
不再贅述。
input要以行為單位,
意思就是space也要列入處理。
/* ACM 10405 Longest Common Subsequence
* mythnc
* 2012/01/09 13:40:53
* run time: 0.024
*/
#include <stdio.h>
#include <string.h>
#define MAXCHAR 1002 /* 1000 + '\n' + '\0' */
#define MAX(X, Y) (X >= Y ? X : Y)
void lcs(char *, char *, int, int);
int list[MAXCHAR][MAXCHAR];
int main(void)
{
char s1[MAXCHAR], s2[MAXCHAR];
int n1, n2;
while (fgets(s1, MAXCHAR, stdin)) {
fgets(s2, MAXCHAR, stdin);
n1 = strlen(s1);
/* eat '\n' */
s1[n1] = '\0';
n1--;
n2 = strlen(s2);
s2[n2] = '\0';
n2--;
lcs(s1, s2, n1, n2);
printf("%d\n", list[n1][n2]);
}
return 0;
}
/* lcs: use DP to find longest len */
void lcs(char *s1, char *s2, int n1, int n2)
{
int i, j;
char tmp[MAXCHAR];
/* start from [1] to save data */
/* so move data from 0~n to 1~(n + 1) */
strcpy(tmp, s1);
strcpy(s1 + 1, tmp);
strcpy(tmp, s2);
strcpy(s2 + 1, tmp);
/* set list[x][0] and list[0][x] to zero */
for (i = 0; i <= n1; i++)
list[i][0] = 0;
for (i = 1; i <= n2; i++)
list[0][i] = 0;
for (i = 1; i <= n1; i++)
for (j = 1; j <= n2; j++)
if (s1[i] == s2[j])
list[i][j] = list[i - 1][j - 1] + 1;
else
list[i][j] = MAX(list[i - 1][j], list[i][j - 1]);
}
沒有留言:
張貼留言