void-man

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

给出两篇文章,问期中最长的公共单词序列是神马?

LCs问题,直接用动态规划,构造一个二维数组a[i][j]第一篇的i单词到第二篇的j单词之前所包含的公共单词个数

然后i to num1  j to num2  iif( 两个单词相等)a[i][j]=a[i-1][j-1]+1 else =max(a[i-1][j],a[i][j-1]);

这样最后构造出来的a[num1-1][num2-1]就是做多的单词数,然后再逆着回去找出每个单词就ok了

1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4  char s[105][35],c[105][35],str[105][35];
5  int a[105][105];
6  int main()
7 {
8 while(scanf("%s",s[1])!=EOF)
9 {
10 int num1=2,num2=1,i,j,k;
11 while(scanf("%s",s[num1])!=EOF)
12 { if(strcmp(s[num1],"#")==0) break;
13 num1++; }
14 while(scanf("%s",c[num2])!=EOF){
15 if(strcmp(c[num2],"#")==0) break;
16 num2++; }
17 for(i=0;i<num1;i++) a[0][i]=0;
18 for(j=0;j<num2;j++) a[j][0]=0;
19 for(i=1;i<num1;i++)
20 for(j=1;j<num2;j++)
21 {
22 if(strcmp(s[i],c[j])==0)
23 a[i][j]=a[i-1][j-1]+1;
24 else if(a[i-1][j]>a[i][j-1])
25 a[i][j]=a[i-1][j];
26 else a[i][j]=a[i][j-1];
27 }
28 i=num1-1,j=num2-1,k=a[num1-1][num2-1];
29 while(k) {
30 if(a[i][j]==a[i-1][j])
31 i--;
32 else if(a[i][j]==a[i][j-1])
33 j--;
34 else {
35 strcpy(str[k],s[i]);
36 j--;
37 k--;
38 }
39 }
40 for(i=1;i<a[num1-1][num2-1];i++)
41 printf("%s ",str[i]);
42 printf("%s\n",str[a[num1-1][num2-1]]);
43 }}
posted on 2011-04-19 22:28  void-man  阅读(233)  评论(0)    收藏  举报