?
?
#include
#include
#include
using namespace std
; int max
(int a
,int b
) { return a
>a
?a
:b
; } char str1
[110
],str2
[110
]; int mark
[110
][110
]; int deal
(int i
,int j
) {
if(i
==0
&&j
==0
) return 0
; if(mark
[i
][j
]==0
) { deal
(i
-1
,j
-1
); printf
("%c"
,str1
[i
-1
]); } else if(mark
[i
][j
]==1
) { deal
(i
-1
,j
); printf
("%c"
,str1
[i
-1
]); } else if(mark
[i
][j
]==2
) { deal
(i
,j
-1
); printf
("%c"
,str2
[j
-1
]); } return 0
; } int main() { int i
,j
; int dp
[110
][110
]; while(~scanf
("%s%s"
,str1
,str2
)) { int len1
=strlen
(str1
); int len2
=strlen
(str2
); memset
(dp
,0
,sizeof(dp
)); for(i
= 0
;i
<=len1
;i
++) mark
[i
][0
] = 1
; for(i
= 0
;i
<=len2
;i
++) mark
[0
][i
] = 2
; for(i
=1
;i
<=len1
;i
++) { for(j
=1
;j
<=len2
;j
++) { if(str1
[i
-1
]==str2
[j
-1
]) { dp
[i
][j
]=dp
[i
-1
][j
-1
]+1
; mark
[i
][j
]=0
; } else { //dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
if(dp
[i
-1
][j
]>=dp
[i
][j
-1
]) { dp
[i
][j
]=dp
[i
-1
][j
]; mark
[i
][j
]=1
; } else { mark
[i
][j
]=2
; dp
[i
][j
]=dp
[i
][j
-1
]; } } } } //printf("****\n"); deal
(len1
,len2
); printf
("\n"
); } return 0
; }
?