POJ 2250 Compromise(最长公共子序列)
题意:求两段文本的最长公共文本;
思路:最长公共子序列+打印公共序列;
#include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[505][505],num1,num2; char s[505][505],s1[505][505],s2[505][505]; void lcs(int a,int b) { if(a==0||b==0) return; if(s[a][b]==0) { lcs(a-1,b-1);printf("%s ",s1[a]); } else if(s[a][b]==-1) { lcs(a-1,b); } else { lcs(a,b-1); } } int main() { int i,j,k; while(scanf("%s",s1[1])!=EOF) { num1=2,num2=1; memset(s,0,sizeof(s)); memset(dp,0,sizeof(dp)); while(scanf("%s",s1[num1])&&s1[num1][0]!='#') num1++; while(scanf("%s",s2[num2])&&s2[num2][0]!='#') num2++; for(i=1;i<num1;i++) { for(j=1;j<num2;j++) { if(!strcmp(s1[i],s2[j])) { dp[i][j]=dp[i-1][j-1]+1;s[i][j]=0; } else { if(dp[i][j-1]>dp[i-1][j]) { dp[i][j]=dp[i][j-1];s[i][j]=1; } else { dp[i][j]=dp[i-1][j];s[i][j]=-1; } } } } lcs(num1-1,num2-1); printf("\n"); } return 0; }
有些梦想现在不去实现,以后就再也没机会了!!