UVa10405 - Longest Common Subsequence

最大公共子序列,需要注意的是x[]最开始保存的是相应字符串的长度,在比较时应比较s1[x[1]-1]与s2[x[2]-1];

水题,做一道过一道。。。

 1 /* 10405 - Longest Common Subsequence */
2 # include <stdio.h>
3 # include <string.h>
4
5 # define MAXN 1001
6
7 int lena;
8 int x[2];
9 char s1[MAXN];
10 char s2[MAXN];
11 int ans[MAXN*MAXN];
12
13 int get(int *x);
14
15 int main()
16 {
17 while (gets(s1) != NULL)
18 {
19 gets(s2);
20 x[0] = lena = strlen(s1);
21 x[1] = strlen(s2);
22 memset(ans, 0xff, sizeof(ans));
23 printf("%d\n", get(x));
24 }
25
26 return 0;
27 }
28
29 int get(int *x)
30 {
31 int ret, index, rem;
32
33 if (!x[0] || !x[1]) return 0;
34 index = x[0]-1 + lena*(x[1]-1);
35 if (ans[index] >= 0) return ans[index];
36 if (s1[x[0]-1] == s2[x[1]-1])
37 {
38 --x[0]; --x[1];
39 ret = get(x) + 1;
40 ++x[0]; ++x[1];
41 }
42 else
43 {
44 ret = 0;
45 --x[0]; if ((rem = get(x)) > ret) ret = rem; ++x[0];
46 --x[1]; if ((rem = get(x)) > ret) ret = rem; ++x[1];
47 }
48 ans[index] = ret;
49 return ret;
50 }



posted on 2012-03-31 14:50  getgoing  阅读(284)  评论(0编辑  收藏  举报

导航