
从暴力递归到动态规划
文章平均质量分 68
步步为营,教你如何从尝试入手,一针见血,轻松解决动态规划问题
梦想new的出来
穷且益坚,不坠青云之志!人工智能,一生的追求!
展开
-
最长公共子序列(存在多个解的情况)
LCS_PLUS关于LCS前面我们已经详细进行讲述了关于LCS的问题,但有意思的是,前面我们都只是输出满足LCS的一个序列,但是现实问题总是复杂多变的,不可避免的的是两个字符串中的LCS很有可能不是唯一的,那么如果要求我们按字典序依次输出所有的LCS,我们又该怎么去做呢?不妨先思考一下,再往下看吧!其实我们只需要回顾之前打表的时候,当b[i-1][j] 等于b[i][j-1]时便是有重复解的情况,此时长度表记录哪个都可以,但是回溯路径时两边便都要走。代码如下for (int i = 1; i &原创 2022-04-26 07:45:22 · 435 阅读 · 2 评论 -
最长公共子序列(记录路径版)
记录路径既然上回讲到我们可以通过**记忆化搜索以及动态规划打表**得到其长度,但令人好奇的是,我们是否可以通过一些简单的手段,将其路径记录下来呢??答案当然是可以的,我们只需要借助一个同等大小的数组便可以满足我们这小小的心愿。心动不如行动~~~请看代码:记忆化搜索int process(string& str1, string& str2, int i, int j) {//以i,j为结尾下标 if (dp[i][j])//如果该位置的答案已经被求解出来,那么直接返回答案原创 2022-04-22 10:49:26 · 483 阅读 · 10 评论 -
最长公共子串
求解最长公共子串既然我们已经知道最长公共子序列的解法,那么相应地子串解法是不是也迎刃而解了呢?首先,子串与子序列什么区别呢?这里我要声明一下,有些题解将子串与子序列混为一谈,标题为子串,但其实求解的是子序列,,这其实是不对的,子串是连续的,而子序列既可以连续也可以不连续,只要字符串里顺序包含序列里的字符即可。还记得求解子序列时我们是怎样列出条件,从记忆化搜索到动态规划的吗?相信现在的你对这类问题已经了如执掌了吧那么我便直接上代码啦记忆化搜索int process(string& st原创 2022-04-13 21:46:22 · 343 阅读 · 2 评论 -
最长公共子序列(计算长度版)
从记忆化搜索到打表问题引入子序列是什么?:例如对于字符串"woaini",wan是其一个子序列,woain也是一个子序列。子序列不要求连续性,而子串必须是连续的。于是我们想到这种方法可以用暴力递归来做,即尝试所有的公共子序列,然后取里面最长的,,但是我们追求更高的效率,我们发先最长公共子序列问题有最优子结构,这个问题可以分解称为更小的问题,,同时,子问题的答案可被重复使用,也就是说更高级别的子问题会重用更小子问题的解。。如此,我们便可以通过记忆化搜索的方式改进递归、下面我们先来推 递归需要满足的条原创 2022-04-04 19:45:21 · 1803 阅读 · 9 评论