博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
最长公共子序问题 ( LCS, Longest Commom Subsequence )
阅读量:3929 次
发布时间:2019-05-23

本文共 1314 字,大约阅读时间需要 4 分钟。

Common Subsequence

时间限制: 1 Sec  内存限制: 128 MB

题目描述

给定序列的子序列是将给定的序列的一些元素(可能没有)省去。给定一个序列X = <x1, x2, ..., xm>另一个序列Z = <z1, z2, ..., zk>是X的子序列存在一个X的指数的严格递增的序列<i1, i2, ..., ik>,对于所有的j = 1,2,...,k, xij = zj。例如,Z = <a, b, f, c>,是X = <a, b, c, f, b, c>的子序列,其索引序列<1, 2, 4, 6>。给定两个序列X和Y,问题是求出X和Y的最大公子序列的长度。

程序输入来自一个文本文件。文件中的每个数据集包含两个字符串,表示给定的序列。这些序列由任意数量的空格分隔。输入数据是正确的。对于每一组数据,每行打印最长度公共子序列的长度。

输入

输出

样例输入

abcfbc abfcabprogramming contest abcd mnp

样例输出

420

   徐不可说:给定两个序列 X=<x1, x2, ..., xm>, Y<y1, y2, ..., yn>,求X和Y长度最长的公共子序列。(子序列中的字符不要求连续)这道题被称为最长公共子序问题,可以用动态规划解决。定义c[i, j]表示Xi和Yj的LCS的长度,可得如下公式:

Longest Common Subsequence Problem

以下为伪算法:

//int n,m;char s[max_n],t[max_m];int dp[max_n+1][max_m+1];   //dp数组void solve(){    for(int i=0;i

显而易见,这是一种记录结果再利用的“动态规划”方法。

本题的ac代码如下:

#include
#include
#include
#include
using namespace std;const int N = 1000;char a[N],b[N];int dp[N][N];int main() { while(scanf("%s%s",&a,&b)!=EOF) { memset(dp,0,sizeof(dp)); int lena=strlen(a); int lenb=strlen(b); for(int i=1; i<=lena; i++) { for(int j=1; j<=lenb; j++) { if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=max(dp[i-1][j],dp[i][j-1]); } } printf("%d\n",dp[lena][lenb]); } return 0;}

 

 

转载地址:http://patgn.baihongyu.com/

你可能感兴趣的文章
javascript 函数,BOM
查看>>
javascript 客户端能力检测
查看>>
javascript DOM详解之DOM1
查看>>
javascript DOM扩展
查看>>
矛盾论读书笔记
查看>>
规则 - 利用CDN缓存
查看>>
[敏捷开发培训] 代码质量检查之利器—SonarQube
查看>>
读书笔记 — 单例模式(JAVA版)
查看>>
LeetCode刷题:1145. 二叉树着色游戏
查看>>
LeetCode刷题:733. 图像渲染 (JAVA代码题解)
查看>>
LeetCode刷题:1129. 颜色交替的最短路径(JAVA代码解题)
查看>>
LeetCode刷题:675. 为高尔夫比赛砍树(JAVA代码详解)
查看>>
[赢得面试] JAVA开发工程师面试题解(持续更新)
查看>>
研发主管的烦恼:没有Product Owner有效参与的Sprint迭代能交付可工作的软件吗?
查看>>
[敏捷开发培训] 什么是敏捷开发中的Spike?
查看>>
[敏捷开发培训] 精益软件开发中的8中浪费(Lean Software Development)
查看>>
[敏捷开发实践] 高质量软件交付之概念模型
查看>>
研发主管的烦恼:如何考核Project Manager
查看>>
杂谈数字化转型(Data Transformation,DX)
查看>>
JAVA算法:无向图的表示
查看>>