关于最长回文,最长公共子串子序列的再思考

总结:

之前在程序设计课上对该知识点进行过解析,不过今天又重温一遍,感觉逻辑又相对清晰了一些,所以写一下想法。
这四个问题是非常经典的问题,我们可能都会做,但每次做之前要思考一阵子才能把逻辑理清,这说明对于一些原则性的东西把握不清,而我们争取做到把每个问题都能理成一条线,使其不处于混沌状态。比如,之前考试最后一道题目应当是背包问题,经典背包问题我们应当都会,但记住的只是代码该怎么写,一但问题变形,需要再深度思考的时候,就会感觉含糊不清,变量保存弄混,思路扯不出来。
我们首先从公共与回文上面进行分析,公共的意思便是给出了两串,而回文则是仅给出了一个串。毫无疑问,dp问题都是小问题更新大问题,但小问题的定义是本身是相对的,一个问题能够直接更新或者是间接更新另一个问题,则其相对于另一个问题便可称之为小问题,形象的来讲,我们可以将看作问题与其直接子问题之间利用箭头相连,这样的话我们dp的整个过程便是在寻找一条拓扑路径,最终走向最大问题。
因此我们解决问题的关键在于定一下状态,规定大问题是如何由以及由哪些小问题更新来的。对于公共以及回文来讲,可以明显的感觉到状态是二维的。而对于公共来讲,很明显问题的子问题的两个维度都要小于等于该问题的两个维度。所以简单的二重循环便可以了,其中每一个维度都附着在一个串上。在这个意义上,其便是一个坐标型的dp。
对于回文来讲,也很显然,其是一个回文区间的扩充,其扩充方向是双向的,因此,我们不能够用通俗意义下的二重递增循环,我们要进行改变或赋予其新的意义。在这里,其是一种区间dp的形式。区间dp显然就是要利用小区间去更新大区间。第一种方法我们可以用第一维表示区间的长度,第二维表示从那个下标开始。第二种方法我们可以采用第一维递减第二维递增的方式进行循环,意义为从下标i到下标j之间的回文序列的长度。关于两种方式,其原则是一样的,一个问题直接由三个子问题决定,所以我们的循环方式保证这三个子问题能够提前解决就行了。
另外讲一下关于子序列与子串的区别,子序列的要求相对较松一点,一个问题的值只会大于等于其子问题的值,而子串则其只有一个子问题,如果满足条件,其值要大于子问题,否则,其值为0。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值