poj_2250 Compromise(输出最长公共子序列)

【题目】

点击这里

【思路】

最长公共子序列的元素变成了单词,算法依然相同。最后输出子序列时,只需根据ans数组从后往前索引,遇到序列元素时就将其入栈,最后出栈输出。

【代码】

#include <stdio.h>
#include <string.h>
#define size 150
#define max(x,y) x>y? x:y

int main()
{
    char s[31], a[size][31], b[size][31];
    int x,y,i,j,total,str[size],ans[size][size];
    for (i=0;i<size;i++) {ans[i][0]=0; ans[0][i]=0;}

    while (scanf("%s",s)!=EOF)
    {
        x=-1; y=-1;
        while (strcmp(s,"#")!=0) {strcpy(a[++x],s); scanf("%s",s);}
        scanf("%s",s);
        while (strcmp(s,"#")!=0) {strcpy(b[++y],s); scanf("%s",s);}

        for (i=1;i<=x+1;i++)
            for (j=1;j<=y+1;j++)
            if (strcmp(a[i-1],b[j-1])==0) ans[i][j]=ans[i-1][j-1]+1;
            else ans[i][j]=max(ans[i-1][j],ans[i][j-1]);

        total=ans[x+1][y+1];
        while (i>0 && j>0)
            if (strcmp(a[i-1],b[j-1])==0) {str[total--]=i-1; i--; j--;}
            else if (ans[i-1][j]>ans[i][j-1]) i--; else j--;
        for (i=1;i<ans[x+1][y+1];i++) printf("%s ",a[str[i]]);
        printf("%s\n",a[str[ans[x+1][y+1]]]);
    }
    return 0;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值