求最长相同子序列:
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<stack>
#define INF 0x3f3f3f3f
using namespace std;
int dp[1005][1005]={0};
int main()
{
char str1[1005];
char str2[1005];
while(scanf("%s %s",str1+1,str2+1)!=EOF)
{
//scanf("%s %s",str1+1,str2+1);
str1[0] = str2[0] = '0';
int len1=strlen(str1)-1 ;
int len2=strlen(str2)-1 ;
for(int i=0;i<len1;i++)
{
dp[i][0]=0;
}
for(int i=0;i<len2;i++)
{
dp[0][i]=0;
}
//str1[0]=str2[0]='0';
//printf("%d %d\n",len1,len2);
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
if(str1[i]==str2[j])
{
dp[i][j]=dp[i-1][j-1]+1;
}
else
{
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
}
}
int pos1=len1,pos2=len2;
stack<char>stk;
while(pos1>0&&pos2>0)
{
if(str1[pos1]==str2[pos2])
{
stk.push(str1[pos1]);
pos1--;
pos2--;
}
else
{
if(dp[pos1-1][pos2]>dp[pos1][pos2-1])
{
pos1--;
}
else
{
pos2--;
}
}
}
while(!stk.empty())
{
printf("%c%c",stk.top(),(stk.size()==1)?'\n':' ');
stk.pop();
}
printf("%d\n",dp[len1][len2]);
}
return 0;
}