题意:打印两个串,但是LCS只打印一次
#include<cstdio> #include<algorithm> #include<cstring> using namespace std; char a[110],b[110]; int dp[110][110]; char m[110][110]; void Find(int i,int j) { if(i==0&&j==0)return; if(m[i][j]=='\\') { Find(i-1,j-1); printf("%c",a[i-1]); } else if(m[i][j]=='|') { Find(i-1,j); printf("%c",a[i-1]); } else if(m[i][j]=='-') { Find(i,j-1); printf("%c",b[j-1]); } } int main() { // freopen("in.txt","r",stdin); // freopen("out.txt","w",stdout); while(~scanf("%s%s",a,b)) { int l1=strlen(a); int l2=strlen(b); memset(m,'\\',sizeof(m)); for(int i=0;i<=l1;i++) { dp[i][0]=0; m[i][0]='|'; } for(int i=0;i<=l2;i++) { dp[0][i]=0; m[0][i]='-'; } for(int i=1;i<=l1;i++) { for(int j=1;j<=l2;j++) { if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1; else if(dp[i-1][j]>=dp[i][j-1]) { dp[i][j]=dp[i-1][j]; m[i][j]='|'; } else { dp[i][j]=dp[i][j-1]; m[i][j]='-'; } } } Find(l1,l2); printf("\n"); } }