【动态规划】最长公共子序列(并续)

【动态规划】最长公共子序列

Time Limit:1000MS  Memory Limit:65536K

Description

一个给定序列的子序列是在该序列中删去若干元素后得到的序列。确切地说,若给定序列X=,则另一序列Z=是X的子序列是指存在一个严格递增的下标序列 ,使得对于所有j=1,2,……,k有:

例如,序列Z=是序列X=的子序列,相应的递增下标序列为<2,3,5,7>。给定两个序列X和Y,当另一序列Z既是X的子序列又是Y的子序列时,称Z是序列X和Y的公共子序列。例如,若X=和Y=,则序列是X和Y的一个公共子序列,序列也是X和Y的一个公共子序列。而且,后者是X和Y的一个最长公共子序列,因为X和Y没有长度大于4的公共子序列。
给定两个序列X=和Y=,要求找出X和Y的一个最长公共子序列。

Input

输入共有两行,每行为一个由大写字母构成的长度不超过200的字符串,表示序列X和Y。

Output

输出第一行为一个非负整数,表示所求得的最长公共子序列的长度,若不存在公共子序列,则输出文件仅有一行输出一个整数0。

Sample Input

 

ABCBDAB
BDCABA

 

Sample Output

 

4
 
 
简单题+AC
#include <cstdio>
#include <string>
#include <algorithm>
using namespace std;
char s[1000],t[1000];
int dp[200][200];
int main()
{
    int l1,l2;
    gets(s);gets(t);
    l1=strlen(s);l2=strlen(t);
    for(int i=0;i<l1;i++)
        for(int j=0;j<l2;j++)
            if(s[i]==t[j])dp[i+1][j+1]=dp[i][j]+1;
            else dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j]);
    printf("%d",dp[l1][l2]);
    return 0;
}

【动态规划】最长公共子序列(续)

Time Limit:1000MS  Memory Limit:65536K 

Description

字符序列的连续子序列是指从给定字符序列中取出若干连续的字符(必须连续)所形成的字符序列。
对给定的两个字符序列,求出他们最长的公共连续子序列。

参考1430

Input

输入共有两行,每行为一个由大写字母构成的长度不超过200的字符串,表示序列X和Y。

Output

输出最长的公共连续子序列长度

Sample Input

 

ABCBDAB
BDCABA

 

Sample Output

 

2
 
 
简单题+AC
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
char s[1000+1],t[1000+1];
int ans,lens,lent,dp[1000+1][1000+1];
int main()
{
	scanf("%s%s",s,t);
	lens=strlen(s);lent=strlen(t);
	for(int i=0;i<lens;i++)
	    for(int j=0;j<lent;j++)
	    {
	        if(s[i]==t[j])dp[i+1][j+1]=dp[i][j]+1;
	        ans=max(ans,dp[i+1][j+1]);
	    }
	printf("%d",ans);
	return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值