uva 10723——Cyborg Genes

题意:输入两个A-Z组成的字符串,找到一个最短的串,使得两个串均是他的子串。


思路:最长公共序列问题。当i和j相等时,dp[i][j]=dp[i-1][j-1],不等时就是max(dp[i-1][j],dp[i][j-1]),如果当前的统计的数量大于s就置为s,否则加上s。


code:

#include <bits/stdc++.h>
using namespace std;

#define cls(a,c) memset(a,c,sizeof (a))
#define ft(i,s,t) for (int i=s;i<=t;i++)
const int N=32,M=1005;

char s1[N],s2[N];
int dp[N][N],num[N][N];
int s,cnt;
void sol(int i,int j){
    if (dp[i][j]==s) num[i][j]+=cnt;
    else if (dp[i][j]>s) dp[i][j]=s,num[i][j]=cnt;
}
int main()
{
    int T;
    scanf("%d",&T);
    getchar();
    ft(ca,1,T){
        cls (dp,63);cls(num,0);gets(s1+1);gets(s2+1);
        int len1=strlen(s1+1),len2=strlen(s2+1);
        dp[1][1]=0;num[1][1]=1;
        ft(i,1,len1+1) ft(j,1,len2+1){
            s=dp[i][j]+1,cnt=num[i][j];
            if (s1[i]==s2[j]) sol(i+1,j+1);
            else sol(i+1,j),sol(i,j+1);
        }
       printf("Case #%d: %d %d\n",ca,dp[len1+1][len2+1],num[len1+1][len2+1]);
    }
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值