http://lightoj.com/login_main.php?url=volume_showproblem.php?problem=1110
这道题是要将最长公共子序列输出,找最长公共子序列与上一篇一样,只是存入的时候需要三维数组,
记录当前状态下的公共子序列,(由前一状态推出)。
#include
#include
char s1[105];
char s2[105];
int dp[105][105];
char s[105][105][105];
int main()
{
int T;
scanf("%d",&T);
for(int i = 1; i <= T; i++)
{
memset(dp,0,sizeof(dp));
memset(s,0,sizeof(s));
scanf("%s%s",s1+1,s2+1);
int n = strlen(s1+1);
int m = strlen(s2+1);
int j,k,l;
for(j = 1; j<=n; j++)
for(k = 1;k<=m; k++)
{
if(s1[j] == s2[k])
{
dp[j][k] = dp[j-1][k-1] + 1;
/*将符合条件的均存入数组中*/
for(l = 0; l < dp[j-1][k-1]; l++)
s[j][k][l] = s[j-1][k-1][l];
s[j][k][l] = s1[j];
}
else{
/*筛选*/
if(dp[j-1][k] > dp[j][k-1])
{
dp[j][k] = dp[j-1][k];
strcpy(s[j][k], s[j-1][k]);
}
else if(dp[j][k-1] > dp[j-1][k])
{
dp[j][k] = dp[j][k-1];
strcpy(s[j][k],s[j][k-1]);
}
else{
dp[j][k] = dp[j-1][k];
if(strcmp(s[j][k-1],s[j-1][k]) > 0)/*按字典序最小*/
strcpy(s[j][k],s[j-1][k]);
else
strcpy(s[j][k],s[j][k-1]);
}
}
}
printf("Case %d: ",i);
if(dp[n][m] == 0)
puts(":(");
else
{
printf("%s\n",s[n][m]);
}
}
}