hdu 1503 LCS
来源:互联网 发布:淘宝联盟微信推广 编辑:程序博客网 时间:2024/06/06 20:57
//71025762012-11-06 23:49:51Accepted15030MS408K1796 BG++chen//1A 只需记录一下共同的位置,然后分段输出就行了 #include<iostream>using namespace std;char x[105];char y[105];int c[105][105];int posx[105];int posy[105];int m,n,i,j,len,num;void lcs(){ for(i=1;i<=m;i++) c[i][0]=0; for(j=1;j<=n;j++) c[0][j]=0; for(i=1;i<=m;i++) for(j=1;j<=n;j++){ if(x[i]==y[j]) c[i][j]=c[i-1][j-1]+1; else if(c[i-1][j]>=c[i][j-1]) c[i][j]=c[i-1][j]; else c[i][j]=c[i][j-1]; } len=c[m][n];}void get_pos(int a,int b){ if(a==0||b==0) return; if(x[a]==y[b]){ get_pos(a-1,b-1); int tmp_num=++num; posx[tmp_num]=a; posy[tmp_num]=b; }else if(c[a-1][b]>=c[a][b-1]){ get_pos(a-1,b); } else get_pos(a,b-1);}int main(){ while(scanf("%s%s",x+1,y+1)!=EOF){ m=strlen(x+1); n=strlen(y+1); lcs(); num=0; get_pos(m,n); int startx=1,starty=1; for(i=1;i<=len;i++){ if(posx[i]!=startx){ for(j=startx;j<posx[i];j++){ cout<<x[j]; } startx=posx[i]+1; }else{ startx++; } if(posy[i]!=starty){ for(j=starty;j<posy[i];j++){ cout<<y[j]; } starty=posy[i]+1; }else{ starty++; } cout<<y[posy[i]]; } if(startx<=m) for(i=startx;i<=m;i++) cout<<x[i]; if(starty<=n) for(i=starty;i<=n;i++) cout<<y[i]; cout<<endl; } return 0;}