算法杂谈:回溯路线

目录

前言

在动态规划中:

在bfs中:


前言

对于普通的路线问题,我们可以存储全局变量path存储路线过程中的,一个个"点"。由于这些点就是按照顺序存储的,路线就是可以直接得到的。

但是如果是动态规划,或者是带有图需要从一个点开始找到另一个点,我们在找到结果后还需要回溯这个结果的实现路线,这里没办法轻松得到路线,那么我们就需要尽可能利用条件,从该结果往回退找到上一个节点是什么,这里介绍两种目前已经遇到的情景。

在动态规划中:

以牛客网 最长公共子序列II 为例

最长公共子序列(二)_牛客题霸_牛客网

找到最长子序列,我们还需要返回这个子序列是什么,既然我们已经完成填表,那么我们就可以,以dp值为引,按照dp值递减的顺序,修改i和j的坐标,当s1[i]==s2[j]时此时这个就是我们要寻找的节点,头插进结果,让i--,j--(意味着继续道s1[0,i-1],s2[0,j-2]区间内寻找);如果不等,往可以使dp值减少的方向前进,于是我们就找到了路线。

代码实现如下:

cpp 复制代码
class Solution {
public:
    string LCS(string s1, string s2) {
        int n=s1.length(),m=s2.size();
        s1=' '+s1,s2=' '+s2;

        vector<vector<int>> dp(n+1,vector<int>(m+1));
        for(int i=1;i<=n;++i)
        {
            for(int j=1;j<=m;++j)
            {
                if(s1[i]==s2[j])dp[i][j]=dp[i-1][j-1]+1;
                else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
        }
        
        //回溯构造LCS
        string ret;
        int i=n,j=m;
        while(i&&j)
        {
            if(s1[i]==s2[j])
            {
                ret=s1[i]+ret;
                --i;
                --j;
            }
            else if(dp[i-1][j]>dp[i][j-1])--i;
            else --j;
        }

        return ret==""?"-1":ret;
    }
};

在bfs中:

以bjfuoj的 码码,我迷路了 为例

BJFUOJ | 码码,我迷路了

该题是一道很简单的bfs经典题,但找到目标点后,我们还需要输出从起点到目标点依次经过的路径,此时依旧利用回溯,构造路线。

回溯路线:因为我们需要从一个节点得到上一个节点的信息,这里节点的信息就是对应的坐标,那么我们可以创建一个"point"类型的二维数组fa,用fa[i][j]存储到达点{i,j}的上一个节点的坐标,具体代码体现就是在bfs中队列push新节点的时候,我们得到的节点假设是{newx,newy},因为newx和newy是由{x,y}得到的,我们使fa[newx][newy]={x,y}这样就得到了上一个节点的位置,就可以实现回溯了。

此篇完。

相关推荐
山上三树几秒前
详细介绍 C 语言 typedef 及与 #define 的核心对比
c语言·数据结构·算法
集芯微电科技有限公司4 分钟前
替代HT6310/KP3310离线式AC-DC无感线性稳压器
数据结构·人工智能·单片机·嵌入式硬件·fpga开发
释怀°Believe6 分钟前
Daily算法刷题【面试经典150题-7️⃣位运算/数学/】
算法·面试·职场和发展
2401_8762213416 分钟前
因数个数、因数和、因数积
c++·算法
云里雾里!26 分钟前
LeetCode 744. 寻找比目标字母大的最小字母 | 从低效到最优的二分解法优化
算法·leetcode
yuanmenghao27 分钟前
CAN系列 — (8) 为什么 Radar Object List 不适合“直接走 CAN 信号”
网络·数据结构·单片机·嵌入式硬件·自动驾驶·信息与通信
一条大祥脚41 分钟前
26.1.3 快速幂+容斥 树上dp+快速幂 带前缀和的快速幂 正序转倒序 子序列自动机 线段树维护滑窗
数据结构·算法
2301_7806698643 分钟前
List(特有方法、遍历方式、ArrayList底层原理、LinkedList底层原理,二者区别)
java·数据结构·后端·list
二狗哈1 小时前
czsc入门5: Tick RawBar(原始k线) NewBar (新K线)
算法·czsc
꧁Q༒ོγ꧂1 小时前
算法详解(四)--排序与离散化
数据结构·算法·排序算法