最长公共子序列定义

最长公共子序列(Longest Common Subsequence,LCS)

flyfish 2015-8-20

假定我们有如下两个序列

S1: 1 2 3 4 5 6

S2: 4 5 6 7 8 9

S1和S2有一个最长公共子序列为 4 5 6

一个子序列不一定必须是连续的,即中间可以被其他字符分开,但它们的顺序必须正确的。

最长公共子序列不一定只有一个。

S1: h e l l o

S2: l e o n

S1和S2有一个最长公共子序列为 eo

《算法导论》的描述

子序列(subsequence)

A subsequence of a given sequence is just the given sequence with zero or

more elements left out.

一个给定序列的子序列就是该给定序列中去掉零个或者多个元素。

left out 忽视,不考虑;被遗忘

leave out的过去时或者被动语态 被遗忘,删掉等

公共子序列(common subsequence)

Given two sequences X and Y, we say that a sequence Z is a common subsequence of X and Y if Z is a subsequence of both X and Y

给定两个序列X和Y,如果Z既是X的一个子序列又是Y的一个子序列,则序列Z是X和Y的一个公共子序列。

最长公共子序列

X和Y的所有公共子序列中长度最长的公共子序列就是最长公共子序列。

Each subsequence of X corresponds to a subset of the indices {1,2,…,n} of X.

X has 2n subsequences。

X的每个子序列对应于X的下标集合{1,2,…,n}的一个子集。X共有2n个子序列。

为什么是2n?

排列组合解释

Combination [k?mb?’ne??(?)n] 美 [,kɑmb?’ne??n]

组合数

Arrangement 英 [?’re?n(d)?m(?)nt] 美 [?’rend?m?nt]

排列数

排列

从n个不同元素中,任取m(m≤n,m与n均为自然数,下同)个元素按照一定的顺序排成一列,叫做从n个不同元素中取出m个元素的一个排列;从n个不同元素中取出m(m≤n)个元素的所有排列的个数,叫做从n个不同元素中取出m个元素的排列数,用符号 A(n,m)表示。

Amn=n(n?1)(n?2)...(n?m+1)

Amn=n!(n?m)!

组合

从n个不同元素中,任取m(m≤n)个元素并成一组,叫做从n个不同元素中取出m个元素的一个组合;从n个不同元素中取出m(m≤n)个元素的所有组合的个数,叫做从n个不同元素中取出m个元素的组合数。用符号 C(n,m) 表示。

Cmn=(n?1)(n?2)...(n?m+1)m!

Cmn=n!m!(n?m)!

Cmn=Cn?mn

(a+b)0=1

(a+b)1=a+b

(a+b)2=a2+2ab+b2

(a+b)3=a3+3a2b+3ab2+b3

(a+b)1=C01a+C11b

(a+b)2=C02a2+C12ab+C22b2

(a+b)3=C03a3+C13a2b+C23ab2+C33b3

(a+b)n当n为正整数时的展开式就是二项式定理(Binomial Theorem)

binomial 英 [ba?’n??m??l] 美 [ba?’nom??l]

adj. 二项式的;二种名称的

n. [数] 二项式;二种名称

theorem 英 [‘θ??r?m] 美 [‘θi?r?m]

n. [数] 定理;原理

二项式各项系数

1

1 1

1 2 1

1 3 3 1

形成了杨辉三角

Crn+Cr+1n=Cr+1n+1

a=1,b=1

C0n+C1n+C2n+…Cnn=2n

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-02 23:37:27

最长公共子序列定义的相关文章

LCS(最长公共子序列)和dp(动态规划)

参照:v_JULY_v 最长公共子序列定义: 注意最长公共子串(Longest CommonSubstring)和最长公共子序列(LongestCommon Subsequence, LCS)的区别:子串(Substring)是串的一个连续的部分,子序列(Subsequence)则是从不改变序列的顺序,而从序列中去掉任意的元素而获得的新序列:更简略地说,前者(子串)的字符的位置必须连续,后者(子序列LCS)则不必.比如字符串acdfg同akdfc的最长公共子串为df,而他们的最长公共子序列是ad

NYOJ 36 &&HDU 1159 最长公共子序列(经典)

链接:click here 题意:tip:最长公共子序列也称作最长公共子串(不要求连续),英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列. 输入 第一行给出一个整数N(0<N<100)表示待测数据组数 接下来每组数据两行,分别为待测的两组字符串.每个字符串长度不大于1000. 输出 每组测试数据输出一个整数,表示最长公共子序列长度.每组

经典dp 最长公共子序列

首先,说明一下子序列的定义…… 一个序列A={a1,a2,a3,...,an},从中删除任意若干项,剩余的序列叫A的一个子序列. 很明显(并不明显……),子序列……并不需要元素是连续的……(一开始的时候思维总是以为元素是连续的,好傻啊……) 然后是公共子序列…… 如果C是A的子序列,也是B的子序列,那么C是A和B的公共子序列…… 公共子序列一般不止一个,最长的那个就是最长公共子序列,当然也可能不止一个…… 煮个栗子…… A={1,3,6,9,5,4,8,7},B={1,6,3,4,5,7} {1

最长公共子序列问题

最长公共子序列: 给定一个序列X={x1,x2,x3...xm},另一个序列Z={z1,z2,z3...zk}满足如下条件时称为X的子序列,即存在一个严格递增的X的下标序列<i1,i2...ik>对所有j=1,2...k满足xi=zj.给定两个序列X,Y,如果既是X的子序列又是Y的子序列,那就称为X,Y的公共子序列.最长公共子序列就是所有子序列中最长的一个或几个. 用动态规划法来解最长公共子序列问题: 1.刻画最长公共子序列的特征 令X={x1,x2,x3...xm},Y={y1,y2,y3.

算法学习 - 最长公共子序列(LCS)C++实现

最长公共子序列 最长公共子序列的问题很简单,就是在两个字符串中找到最长的子序列,这里明确两个含义: 子串:表示连续的一串字符 . 子序列:表示不连续的一串字符. 所以这里要查找的是不连续的最长子序列, 动态规划 这里为什么要使用动态规划可以说一下,简单来说动态规划是为了降低时间复杂度的一种算法,申请一个额外空间,来保存每一个步骤的结果,最后从这些结果中找到最优的解. 这里有个问题就是:一般来说,当前的最优解,只与当前时刻和上一时刻有关系,和其他时刻没有关系,这样才能让动态规划发生作用,降低复杂度

hdu1243 dp (类最长公共子序列)

题意:射击演习中,已知敌人出现的种类顺序,以及自己的子弹种类顺序,当同种类的子弹打到同种类的敌人时会得到相应分数,问最多能得多少分. 这题的题意很好理解,而且模型也很常见,是带权值的类最长公共子序列问题.但是我 WA 了四发```第一发,t 定义了两次,并执意要从下标 1 开始读(这个貌似没问题的).第二次是改了之后 dp 数组的转移方程没有写对.第三 WA 是改了转移方程还是没有改对Orz ,第四 WA 是```我的内心几乎是崩溃的,恩,还是没有改对…… 1 #include<stdio.h>

hdu 1159 Common Subsequence(最长公共子序列 DP)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1159 Common Subsequence Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 25416    Accepted Submission(s): 11276 Problem Description A subsequence of

求解两个序列的所有最长公共子序列(LCSes)

 摘要 本篇博文提供了实现求解所有最长公共子序列的程序实现,并提供输出所有公共子序列的方法解释,需要具备基础知识是求解一个公共子序列的动态规划方法,请自行查阅相关资料. 题目重述 子序列概念:设X=< x1, x2,┅, xm>,若有1≤i1< i2< ┅ <ik≤m,使得Z=< z1, z2,┅, zk> = < xi1, xi2,┅, xik>,则称Z是X的子序列,记为Z<X. 例如: X=<A,B,C,B,D,A,B>, 

算法——动态规划篇——最长公共子序列

问题描述      最长公共子序列,英文缩写为LCS(Longest Common Subsequence).其定义是,一个序列 S ,如果分别是两个或多个已知序列的子序列,且是所有符合此条件序列中最长的,则 S 称为已知序列的最长公共子序列.       解决最长公共子序列,一种常用的办法,就是穷举法,组合出所有的情况,但是这样对于长序列的情况来说,是非常不实际.. 假设现在有两个序列,x[]={'A','B','C','B','D','A','B'};y[]={'B','D','C','A'