Pku acm 2250 Compromise

这个也是求最长公共字串,只是相比Common Subsequence需要记录最长公共字串的构成,此时箭头的标记就用上了,在程序中,用d[][]存放标记,2表示朝向左上方,1表示指向上,-1表示指向左。S[][]存放当前最大字串长度。在求最优解时,顺着箭头从后向前寻找公共字串的序号,记录下来,输出即可。该算法在算法导论中有详细的讲解。

 

#include<iostream>  
#include<string.h>  
using namespace std;  
char a[101][31],b[101][31],c[31];  
int n,i,j,an,bn,d[101][101],s[101][101];  
int main()  
{  
    while(scanf("%s",&c)!=EOF)  
    {  
        if(strcmp(c,"#")==0)  
        {  
            n++;  
        }  
        if(n==0)  
        {  
            strcpy(a[++an],c);  
        }  
        else if(n==1)  
        {  
            strcpy(b[++bn],c);  
        }  
        else 
        {  
            memset(s,0,sizeof(s));  
            for(i=1;i<=an;i++)  
            {  
                for(j=1;j<=bn;j++)  
                {  
                    if(strcmp(a[i],b[j])==0)  
                    {  
                        s[i][j]=s[i-1][j-1]+1;  
                        d[i][j]=2;  
                    }  
                    else   
                    {  
                        if(s[i][j-1]>=s[i-1][j])  
                        {  
                            s[i][j]=s[i][j-1];  
                            d[i][j]=-1;  //向左  
                        }  
                        else 
                        {  
                            s[i][j]=s[i-1][j];  
                            d[i][j]=1;  //向上  
                        }  
                    }  
                }  
            }  
            for(i=an,j=bn;i>0&&j>0;)  
            {  
                if(d[i][j]==2)  
                {  
                    s[0][s[i][j]]=i;  
                    i--;  
                    j--;  
                }  
                else if(d[i][j]==-1)  
                {  
                    j--;  
                }  
                else   
                {  
                    i--;  
                }  
            }  
            for(i=1;i<=s[an][bn];i++)  
                printf("%s ",a[s[0][i]]);  
            printf("/n");  
            an=0;  
            bn=0;  
            n=0;  
        }  
    }  
    return 0;  


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/h15019901998/archive/2010/03/10/5365267.aspx

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值