uva 531 Compromise
2011-10-22 19:02
344 查看
题意:寻找两个句子的最长公共子序列。
#include <iostream> #include <cstdio> #include <cstring> using namespace std; char str1[105][35],str2[105][35],ans[105][35]; int map[105][105],change[105][105]; int main() { int n1=0,n2=0; while(scanf("%s",str1[n1])!=EOF) { while(strcmp(str1[n1],"#")!=0) { n1++; scanf("%s",str1[n1]); } while(scanf("%s",str2[n2])!=EOF) { if(strcmp(str2[n2],"#")==0) break; n2++; } //printf("n1=%d,n2=%d\n",n1,n2); int imax=0,x,y; for(int i=0;i<n1;i++) { for(int j=0;j<n2;j++) { if(strcmp(str1[i],str2[j])==0) { map[i+1][j+1]=map[i][j]+1; change[i+1][j+1]=2; } else { if(map[i][j+1]>map[i+1][j]) { map[i+1][j+1]=map[i][j+1]; change[i+1][j+1]=1; } else { map[i+1][j+1]=map[i+1][j]; change[i+1][j+1]=3; } } if(map[i+1][j+1]>imax) { imax=map[i+1][j+1]; x=i+1;y=j+1; } } } int cnt=0; while(x&&y) { if(change[x][y]==2) {strcpy(ans[cnt++],str1[x-1]);x--;y--;} else if(change[x][y]==1) {x--;} else y--; } for(int i=cnt-1;i>0;i--) printf("%s ",ans[i]); printf("%s\n",ans[0]); n1=n2=0; memset(map,0,sizeof(map)); memset(change,0,sizeof(change)); } return 0; }
相关文章推荐
- UVa 531 Compromise (DP 最长公共子序列)
- UVa 531 - Compromise
- uva 531 Compromise
- uva 531 - Compromise
- uva 531 Compromise(LCS)
- UVA - 531 Compromise
- uva531 - Compromise(动规,lcs)
- uva 531 Compromise
- UVa 531: Compromise
- Compromise - POJ 2250 UVa 531 dp
- uva 531 Compromise
- UVA 531 - Compromise(dp + LCS打印路径)
- UVA 531 - Compromise(dp + LCS打印路径)
- uva 531 Compromise
- UVA531- Compromise
- UVa 531 Compromise
- POJ 2250 & UVA 531 Compromise(字符串、 最长公共子序列)
- [LCS]Uva531 Compromise
- uva 531 - Compromise
- uva 531 - Compromise