最长子序列问题,需要打印路径。作为一个菜鸟,我竟然非要“自创”一种方法,结果是惨痛的。最后还是参考前辈的代码,用一个二维数组记录指向,0表示斜移,1、-1是左移或上移。本来按我的原则抄的代码是不应该贴出来的,但这次我无耻地改了一下再贴,方便以后自己看。

 1 #include<stdio.h>
 2 #include<string.h>
 3 #define MAXN 110
 4 #define MAXM 40
 5 char a[MAXN][MAXM], A, b[MAXN][MAXM], B;
 6 int f[MAXN][MAXN], p[MAXN][MAXN], flag;
 7 int init()
 8 {
 9     int i;
10     A = B = 1;
11     for(;;)
12     {
13         if(scanf("%s", a[A]) != 1)
14             return 0;
15         if(a[A][0] == '#')
16             break;
17         A ++;
18     }
19     for(;;)
20     {
21         scanf("%s", b[B]);
22         if(b[B][0] == '#')
23             break;
24         B ++;
25     }
26 }
27 void printresult(int i, int j)
28 {
29     if(!i || !j)
30         return ;
31     if(p[i][j] == 0)
32     {
33         printresult(i - 1, j - 1);
34         if(flag)
35             printf(" ");
36         else
37             flag = 1;
38         printf("%s", a[i]);
39     }
40     else if(p[i][j] == -1)
41         printresult(i - 1, j);
42     else
43         printresult(i, j - 1);
44 }
45 int main()
46 {
47     while(init())
48     {
49         int i, j;
50         memset(f, 0, sizeof(f));
51         for(i = 1; i < A; i ++)
52             for(j = 1; j < B; j ++)
53             {
54                 if(strcmp(a[i], b[j]) == 0)
55                 {
56                     f[i][j] = f[i - 1][j - 1] + 1;
57                     p[i][j] = 0;
58                 }
59                 else
60                 {
61                     f[i][j] = f[i - 1][j];
62                     p[i][j] = -1;
63                     if( f[i][j - 1] > f[i][j])
64                     {
65                         f[i][j] = f[i][j - 1];
66                         p[i][j] = 1;
67                     }
68                 }
69             }
70         flag = 0;
71         printresult(A - 1, B - 1);
72         printf("\n");
73     }
74     return 0;
75 }