11、序列与子序列问题解析

序列与子序列问题解析

在计算领域,涉及序列和子序列的问题十分常见,比如在基因组学、文本处理、数据挖掘和数据压缩等方面。下面我们将深入探讨三个相关问题,包括最长上升子序列、最长公共子序列以及最大和短片段问题。

1. 最长上升子序列问题

最长上升子序列问题是指,给定一个有序类型的元素序列,找出其中元素严格递增的最长子序列。我们使用函数 lus 来计算这个最长上升子序列:

lus::Ord a ⇒[a] →[a]
lus ←MaxWith length·filter up·subseqs

其中, up 函数用于判断一个序列是否为上升序列:

up::Ord a ⇒[a] →Bool
up xs = and (zipWith (<) xs (tail xs))

subseqs 函数用于生成序列的所有子序列,有两种基于 foldr 的定义方式:

-- 第一种方式
subseqs::[a] →[[a]]
subseqs = foldr step [[ ]]
where step x xss = xss++map (x:) xss

-- 第二种方式
subseqs::[a] →[[a]]
subseqs = foldr (concatMap·extend) [[ ]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值