在LCS中如果需要在求LCS的过程中求出其他量,一般不会在两层for循环结束后单独求,而是在LCS的过程中求出来。
如例题:UVA11404 HDU1080
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);i++)
#define ss(s) scanf("%s",s)
#define ret(i,a,b) for(int i=(a);i>=(b);i--)
const int maxn=1000+10;
char s1[maxn],s2[maxn],ans[maxn];
struct node{
int len;
string str;
}f[maxn][maxn];
int len;
int main()
{
while(ss(s1+1)!=EOF)
{
len=(int)strlen(s1+1);
memcpy(s2+1,s1+1,sizeof(char)*len);
s2[len+1]='\0';
reverse(s2+1,s2+1+len);
for(int i=0;i<=len;i++) f[0][i].len=f[i][0].len=0,f[0][i].str=f[i][0].str="";
rep(i,1,len) rep(j,1,len){
if(s1[i]==s2[j]) {f[i][j].len=f[i-1][j-1].len+1;f[i][j].str=f[i-1][j-1].str+s1[i];}
else {
if(f[i-1][j].len>f[i][j-1].len){
f[i][j].len=f[i-1][j].len;
f[i][j].str=f[i-1][j].str;
}
else if(f[i-1][j].len<f[i][j-1].len){
f[i][j].len=f[i][j-1].len;
f[i][j].str=f[i][j-1].str;
}
else{
f[i][j].len=f[i-1][j].len;
f[i][j].str=min(f[i-1][j].str,f[i][j-1].str);
}
}
}
int maxd=f[len][len].len;
string ans=f[len][len].str;
if(maxd&1)
{
rep(i,0,maxd/2-1) cout<<ans[i];
ret(i,maxd/2,0) cout<<ans[i];
}
else{
rep(i,0,maxd/2-1) cout<<ans[i];
ret(i,maxd/2-1,0) cout<<ans[i];
}
cout<<endl;
}
return 0;
}