问题
源码
#include<iostream>
#include<string.h>
using namespace std;
const int MAX_N=20;
char a[MAX_N]="abcd";
char b[MAX_N]="becd";
char sub[MAX_N];
int n1=4,n2=4;
int dp[MAX_N+1][MAX_N+1];
int path[MAX_N][MAX_N];
int max(int a,int b) {
return a>b?a:b;
}
int solve() {
int i,j,k;
memset(dp,0,sizeof(int)*(n1+1)*(n2+1));
for(i=1; i<=n1; i++) {
for(j=1; j<=n2; j++) {
if(a[i-1]==b[j-1]) {
dp[i][j]=dp[i-1][j-1]+1;
path[i][j]=1;
} else if(dp[i-1][j]>dp[i][j-1]) {
dp[i][j]=dp[i-1][j];
path[i][j]=2;
} else {
dp[i][j]=dp[i][j-1];
path[i][j]=3;
}
}
}
for(i=n1,j=n2,k=dp[n1][n2]-1; k>=0;) {
if(path[i][j]==1) {
sub[k--]=a[i-1];
i--;
j--;
} else if(path[i][j]==2) i--;
else j--;
}
return dp[n1][n2];
}
int main() {
cout<<solve()<<"(\"";
for(int i=0; i<dp[n1][n2]; i++) cout<<sub[i];
cout<<"\")"<<endl;
return 0;
}