最长公共子序列问题和动态规划

最长子序列问题

子序列定义

这里写图片描述
可以注意到,子序列不要求所选的字母连续,只要求是按原次序组成就好
这是和子串的一个区别

这里写图片描述
##最长公共子序列定义
最长公共子序列(L ongest C ommon S equence)
简称为LCS,下同
这里写图片描述
直观明了,就是两个序列的共有的子序列中最长的一个,
此图里就是 DATA这一个单词
#解法
##1. 暴力法
首先我们想到的便是把两个序列的所有可能的子序列枚举出来,一一进行比较.

所有一个序列的子序列的组合有 ** 2 n 2^n 2n**种可能,而且需要m次比较.

所以时间复杂度是O( m ∗ 2 n m*2^n m2n),空间复杂度是O(2^n);

显然出现了 指数形式的复杂度,这是在时间和空间上无法接受的.
##2 递归
对于序列A[0,N] 和A[0,M];
他们的最长自序列LCS(A,B)有三种情况

①. 最后一个字母相等,直接将其剔除

这里写图片描述

②.末子符不等

这里写图片描述

这有点不好理解,其实在开始递归时 ,程序并不知道谁能取得更大的字串,

所以将分别对应的两种情况都进行递归直到递归出口,(相当于将每种情况都走完)

之后把所有的情况每次都层层返回,

每次返回都进行一次比较,总是取最大的返回值,这样就得到了更长者

③.递归出口

当序列为空的时候,返回0;

总结下来就是如下公式
这里写图片描述

根据这个公式很容易得出递归版的代码

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

char a[30], b[30];
int a_len, lenb;
int LCS(int, int);

  • 7
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值