我用动态规划,下面主要讲一下怎么去思考这个题。

在我的《通过金矿模型介绍动态规划》一文中我提到思考动态规划可以分为9个步骤,其实这9步中第一步是最重要的,就是如何模拟这个过程。

拿到这道题的时候,我们可以这样想,假如我有一张条纸,上面写了一个串s,我需要从前面开始剪掉一个前缀,但是每次剪下来的子串都必须是P集合中的元素,我需要知道剪掉的前缀最长可以有多长。

现在来思考问题的最后一步。如果最多可以剪掉长度为k的前缀,那么最后一步就是在s的k前缀中我需要从末尾剪掉哪一个子串,而这个字串必须是p中的元素。

那我到底剪掉p中的哪一个呢?我一个一个的试(选择),比如我选择p1,此时我的子问题就是这去掉了p1的k前缀能不能用p中的元素组合而得,可见出现了“子问题重叠”。

可见如果去掉了p1的k前缀能够用p中的元素组合而得,那么k前缀就能够用p中的元素组合而得,这叫“最优子结构”。

如果s的长度为length,p中有n个字串,那么就有length个前缀(问题数),对每个前缀有n种选择,算法的复杂度为O(length * n)

 

Code

 

 

 

posted on 2008-12-16 15:51  刘永辉  阅读(391)  评论(0编辑  收藏  举报