DFS(深度优先搜索)详解(概念讲解,图片辅助,例题解释)

news2025/1/14 18:28:41

目录

那年深夏

引入

1.什么是深度优先搜索(DFS)?

2.什么是栈?

3.什么是递归?

图解过程

 问题示例

1、全排列问题

2、迷宫问题

3、棋盘问题(N皇后)

 4、加法分解

模板

剪枝

1.简介

2.剪枝的原则  

3.剪枝策略的寻找的方法

4.常见剪枝方法

最后


那年深夏

他终于抬起头,眨了眨眼睛。“停下来!”语气充满了不悦。

“啊?”

“别再丢那可恶的硬币了!”

“唔。”孙翱将硬币放回口袋,“局长先生,请您务必听我说一句。那些家伙越来越猖狂了,昨天一晚上,就……”

“说过多少次了,不要拿你们这些挖墓的事烦我”

“我们申请增加警力”,孙翱以冷静的口气问道,似乎没听见局长的话。

“另外”,孙翱站起,“他们装备比以前先进,而且似乎都想要什么同样的东西。让我不禁怀疑他们有什么后台。”说罢,还瞟了一眼局长。

局长的脸色突然变了一下,却又马上恢复。“我记得,你们那边地形很复杂。”

“当然。不过,只要有些小道具,再用深度优先搜索搜一找,几百条路线都有了”,孙翱将椅子推回桌边。

“等等”,局长猛地站起,“他们都被你们捉住了吗?”

“我让你猜猜看”,孙翱随即离去,连个招呼也不打。

对于局长的问题,他很清楚答案,是 “不”。就在昨天,就在那个雨夜,就在那个坟旁……


引入

1.什么是深度优先搜索(DFS)?

深度优先搜索作为初学者遇到的第一个算法,给大家留下了许多“美好”的回忆。不说废话,先来看看百度百科是怎么说的。

深度优先搜索是一种在开发爬虫早期使用较多的方法。它的目的是要达到被搜索结构的叶结点(即那些不包含任何超链的HTML文件) 。在一个HTML文件中,当一个超链被选择后,被链接的HTML文件将执行深度优先搜索,即在搜索其余的超链结果之前必须先完整地搜索单独的一条链。深度优先搜索沿着HTML文件上的超链走到不能再深入为止,然后返回到某一个HTML文件,再继续选择该HTML文件中的其他超链。当不再有其他超链可选择时,说明搜索已经结束。

TMD,笑死,根本看不懂。看看我们敬爱的jc的怎么说吧。

一种用于遍历或搜索树或图的算法。 沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所在边都己被探寻过或者在搜寻时结点不满足条件,搜索将回溯到发现节点v的那条边的起始节点。整个进程反复进行直到所有节点都被访问为止。属于盲目搜索,最糟糕的情况算法时间复杂度为O(!n)。

来自:​​​​​​lgeneralKnowledge/基础算法/深度优先搜索.md · jimmyflower6/中山一中初中部信息竞赛 - 码云 - 开源中国 (gitee.com)

 还可以,不过,更简洁的在下面,来自《我的第一本算法书》

深度优先搜索和广度优先搜索一样,都是对图进行搜索的算法,目的也都是从起点开始搜 索直到到达指定顶点(终点)。深度优先搜索会沿着一条路径不断往下搜索直到不能再继续为止,然后再折返,开始搜索下一条候补路径。

2.什么是栈?

定义:栈(stack)又名堆栈,它是一种运算受限的线性表。限定仅在表尾进行插入和删除操作的线性表。这一端被称为栈顶,相对地,把另一端称为栈底。栈是一种后进先出(last in first out)的线性表,简称LIFO。

进栈操作:向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;

出栈操作:从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

上述材料,来自c++栈详解_Yoyo_1014的博客-CSDN博客 


图片表示

3.什么是递归?

递归,说白了,就是函数的自身调用。通过自调用,将原问题的求解转换为许多性质相同但规模更小的子问题。

它需要满足3个条件

  1. 能够将一个问题转换成为一个新问题,并且新问题的解法和原来问题的解法类同或者相同,不同的仅是处理对象,且处理对象有一定依据。
  2. 可以通过上述转化使问题一步步简化。
  3. 有明确的递归出口,或者说叫递归边界。


图解过程

A为起点,G为终点。一开始我们在起点A上。 

将可以从A直达的三个顶点B、C、D设为下一 步的候补顶点。 

从候补顶点中选出一个 顶点。优先选择最新成为 候补的点,如果几个顶点 同时成为候补,那么可以从中随意选择一个。 

此处 B、C、D 同时成为候补,所以我们随机选择了最左边的顶点。 

移动到选中的顶点B。此时我们在B上,所以B变为红色,同时将已经搜索过的顶点变为橙色。

此处,候补顶点是用“后入先出”(LIFO)的方式来管理的。

将可以从B直达的两个顶点E和F设为候补顶点。 

此时,最新成为候补顶点的是 E 和 F,我们选择 了左边的顶点E。 

移动到选中的顶点E上。

将可以从E直达的顶点K设为候补顶点。 

重复上述操作直到到达终点,或者所有顶点都被遍历为止。 

这个示例的搜索顺序为A、B、E、K、F、C、H。 

现在我们搜索到了顶点C。 

 到达终点G,搜索结束。


 问题示例

因为一些原因,我们将只用递归来实现深搜。

1、全排列问题

【题意】
先给一个正整数 ( 1 < = n < = 10 ),输出所有全排列。
什么是全排列,例如n=3,输出所有组合,并且按字典序输出:
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1
每个全排列一行,相邻两个数用空格隔开(最后一个数后面没有空格)
【输入格式】
一行一个整数n。
【输出格式】
输出1~n的所有全排列。
【样例输入】
3
【样例输出】
1 2 3
1 3 2
2 1 3
2 3 1
3 1 2
3 2 1

首先,是定义。 
定义a数组表示一排格子,它们以后用来存号码的。
定义bo数组来标记每个号码是否可填,v[i]==0表示号码i可用:可以用来填进格子。 反之不行。

然后,就是输入。
不用多说,输入n即可。

最后,就是递归部分。定义dfs(k)表示第k个数的全排列。

终止条件是k==n+1,因为到那时,前n个数都有了全排列,不用再进行加入数字了。当递归终止,输出,并用return语句返回上一层。

当未到达终止条件时,循环1-n,表示在此位置可能填上1、2、3、4、... 、n 这些数字。

当v[i]==0表示该数没被使用,就执行语句,使用。

然后就没了。

#include<bits/stdc++.h>
using namespace std;
int n;         
int a[110];    
bool v[110];   
void dfs(int k)
{
    if(k==n+1) 
    {
        for(int i=1;i<n;i++) printf("%d ",a[i]);   
        printf("%d\n",a[n]);
        return;
    }
    else
    {
        for(int i=1;i<=n;i++)
           if( v[i]==0 ) 
           {
              v[i]=1;    
              a[k]=i;    
              dfs(k+1);  
              a[k]=0;    
              v[i]=0;          
           }
    }
}
int main()
{
    scanf("%d",&n);
    memset(v,0,sizeof(v)); 
    dfs(1);                
    return 0;
}

2、迷宫问题

这类问题比较多,这里选取一道比较好的。

【题意】 
    一个n*m的网格,从出发点(stx,sty)出发到右下角(edx,edy),只允许上下左右4个方向走到相邻的格子。
    格子为1可以走,为0无法走。输出所有可行的路线。
注意:本题没有spj,请统一用 左上右下的顺序拓展,也就是:
int dx[4]={0,-1,0,1};
int dy[4]={-1,0,1,0};
【输入格式】
    第一行是两个数n,m( 1 < n , m < 15 ).
接下来是n行m列由1和0组成的矩阵。
最后两行是起始点和结束点。
【输出格式】
    所有可行的路径,描述一个点时用(x,y)的形式,除开始点外,其他的都要用“->”表示方向。
如果没有一条可行的路则输出-1。
【样例输入】
5 6
1 0 0 1 0 1
1 1 1 1 1 1
0 0 1 1 1 0
1 1 1 1 1 0
1 1 1 0 1 1
1 1
5 6
【样例输出】
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(2,4)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(3,4)->(4,4)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(2,4)->(2,5)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(3,4)->(3,5)->(4,5)->(5,5)->(5,6)
(1,1)->(2,1)->(2,2)->(2,3)->(3,3)->(4,3)->(4,4)->(4,5)->(5,5)->(5,6)

思路:很简单,以上下左右 四个方向进行搜索,并记录下步骤即可。重点在于输出,要细心。不过,有一个易错点需要提醒一下:在开始前,要将起点标记为已走过,不然可能出现来回横跳的情况。

#include<bits/stdc++.h>
using namespace std;
bool flag=false;
struct node{
    int x,y;
}en,st,m1[1005];
int dx[4]={0,-1,0,1};
int dy[4]={-1,0,1,0};
int n,m,a[1005][1005];
void dfs(int x,int y,int k)
{
    if(x==en.x&&y==en.y)
    {
        flag=true;
        for(int i=1;i<k;i++) printf("(%d,%d)->",m1[i].x,m1[i].y);
        printf("(%d,%d)\n",m1[k].x,m1[k].y);
        return;
    }
    for(int i=0;i<4;i++)
    {
        node nxy;
        nxy.x=dx[i]+x;
        nxy.y=dy[i]+y;
        if(a[nxy.x][nxy.y]!=0)
        {
            a[nxy.x][nxy.y]=0;
            m1[k+1]=nxy;
            dfs(nxy.x,nxy.y,k+1);
            a[nxy.x][nxy.y]=1;
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    scanf("%d%d%d%d",&st.x,&st.y,&en.x,&en.y);
    m1[1]=st;
    a[st.x][st.y] = 0;
    dfs(st.x,st.y,1);
    if(flag==false) printf("-1");
}

3、棋盘问题(N皇后)

【题意】
会下国际象棋的人都很清楚:皇后可以在横、竖、斜线上不限步数地吃掉其他棋子。如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!
这就是著名的八皇后问题。
【输入格式】
一个整数n( 1 < = n < = 10 )
【输出格式】
每行输出对应一种方案,按字典序输出所有方案。每种方案顺序输出皇后所在的列号,相邻两数之间用空格隔开。
【样例输入】
4
【样例输出】
2 4 1 3
3 1 4 2
 

思路:一行行地搜,在每一行中,循环遍历每列,用四个数组判断是否能放。(row表示行,col表示列,LL左对角线,RR表示有对角线)。对于对角线与行列的关系,是一个数学问题。这里就不详细讲解了。

#include<bits/stdc++.h>
using namespace std;
int n,a[35][35];
bool row[30],col[30],LL[30],RR[30];
void dfs(int x)
{
    if(x==n+1)
    {
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
                if(a[i][j]==1)
                {
                    printf("%d ",j);
                }
            }
        }
        printf("\n");
    }
    else
    {
        int i=x;
        for(int j=1;j<=n;j++)
        {
            if(row[i]==0&&col[j]==0&&LL[i-j+n]==0&&RR[i+j]==0)
            {
                a[i][j]=1;
                row[i]=col[j]=LL[i-j+n]=RR[i+j]=1;
                dfs(x+1);
                a[i][j]=0;
                row[i]=col[j]=LL[i-j+n]=RR[i+j]=0;
            }
        }
    }
}
int main()
{
    scanf("%d",&n);
    memset(row,0,sizeof(row));
    memset(col,0,sizeof(col));
    memset(LL,0,sizeof(LL));
    memset(RR,0,sizeof(RR));
    memset(a,0,sizeof(a));
    dfs(1);
    return 0;
}

 4、加法分解

【题意】(本题附有视频)
    输入自然数n,然后将其分拆成由若干数相加的形式,参与加法运算的数可以重复。具体格式请仔细研究样例输出!
【输入格式】
    待拆分的自然数n(n<=50)。
【输出格式】
    若干数的加法式子。
【输入样例】
7
【输出样例】
1+6
1+1+5
1+1+1+4
1+1+1+1+3
1+1+1+1+1+2
1+1+1+1+1+1+1
1+1+1+2+2
1+1+2+3
1+2+4
1+2+2+2
1+3+3
2+5
2+2+3
3+4
 

思路日后更新。。。

#include<bits/stdc++.h>
using namespace std;
int n,a[55];
void dfs(int x,int k)
{
    if(k>1)
    {
        for(int i=1;i<k;i++) printf("%d+",a[i]);
        printf("%d\n",x);
    }
    for(int i=a[k-1];i<=x/2;i++)
    {
        a[k]=i;
        dfs(x-i,k+1);
        a[k]=0;
    }   
}
int main()
{
    scanf("%d",&n);
    a[0]=1;
    dfs(n,1);
}


模板

虽然不那么明显,但深搜也是有一套模板的。

void dfs(int step)
 
{
 
    判断边界
 
    {
 
        相应操作
 
        }
 
    尝试每一种可能
 
    {
 
        满足check条件
 
        标记
 
        继续下一步dfs(step+1)
 
        恢复初始状态(回溯的时候要用到)
 
    }
 
}

剪枝


        剪枝,就是减小搜索树规模、尽早排除搜索树中不必要的分支的一种手段。形象地看,就好像剪掉了搜索树的枝条,故被称为剪枝。

1.简介

    在搜索算法中优化中,剪枝,就是通过某种判断,避免一些不必要的遍历过程,形象的说,就是剪去了搜索树中的某些“枝条”,故称剪枝。应用剪枝优化的核心问题是设计剪枝判断方法,即确定哪些枝条应当舍弃,哪些枝条应当保留的方法。

2.剪枝的原  

1) 正确性

  正如上文所述,枝条不是爱剪就能剪的. 如果随便剪枝,把带有最优解的那一分支也剪掉了的话,剪枝也就失去了意义. 所以,剪枝的前提是一定要保证不丢失正确的结果.

  2)准确性

  在保证了正确性的基础上,我们应该根据具体问题具体分析,采用合适的判断手段,使不包含最优解的枝条尽可能多的被剪去,以达到程序“最优化”的目的. 可以说,剪枝的准确性,是衡量一个优化算法好坏的标准.

 3)高效性

设计优化程序的根本目的,是要减少搜索的次数,使程序运行的时间减少. 但为了使搜索次数尽可能的减少,我们又必须花工夫设计出一个准确性较高的优化算法,而当算法的准确性升高,其判断的次数必定增多,从而又导致耗时的增多,这便引出了矛盾. 因此,如何在优化与效率之间寻找一个平衡点,使得程序的时间复杂度尽可能降低,同样是非常重要的. 倘若一个剪枝的判断效果非常好,但是它却需要耗费大量的时间来判断、比较,结果整个程序运行起来也跟没有优化过的没什么区别,这样就太得不偿失了.

3.剪枝策略的寻找的方法

1)微观方法:从问题本身出发,发现剪枝条件

2)宏观方法:从整体出发,发现剪枝条件。

3)注意提高效率,这是关键,最重要的。

总之,剪枝策略,属于算法优化范畴;通常应用在DFS 和 BFS 搜索算法中;剪枝策略就是寻找过滤条件,提前减少不必要的搜索路径。

4.常见剪枝方法

a.优化搜索顺序
在一些问题中,搜索树的各个分支之间的顺序是不固定的不同的搜索顺序会产生不同的搜索形态,规模也相差甚远

b.排除等效分支

在搜索过程中,如果我们能够得知搜索树的当前节点沿着某几条不同分支到达的子树是等效的,那么只需要对其中一条路径进行搜索

c.是否可行剪枝

在搜索过程中,每次对当前状态进行检查,如果发现不可能到达递归边界,就执行回溯

d.最优性剪枝

在求解最优解的过程中,如果当前解已经没有当前最优解优秀,此时可以执行回溯语句

e.记忆化剪枝

记录每个状态的搜索结果,在重复遍历一个状态时返回。

参考资料:剪枝算法_命z的博客-CSDN博客_剪枝算法


最后

再见,给个点赞吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/178757.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Jupyter notebook折叠隐藏cell代码块 (hidden more than code cell in jupyter notebook)

Nbextensions 中的 hidden input 可以隐藏cell 我们在notebook中嵌入了一段画图的代码&#xff0c;影响代码阅读&#xff0c;搜一下的把这段代码隐藏。 我们使用了 jupyter notebook配置工具 Nbextensions。找到hidden input&#xff0c;这样只会隐藏输入的代码&#xff0c;而…

Tkinter的Radiobutton控件

Tkinter的Radiobutton是一个含有多个选项的控件&#xff0c;但是只能选择其中的一个选项 使用方法 R1tk.Radiobutton(root,textA,variablevar,valueA,commandprintf) R1.pack() R2tk.Radiobutton(root,textB,variablevar,valueB,commandprintf) R2.pack() R3tk.Radiobutton(ro…

【Linux】同步与互斥

目录&#x1f308;前言&#x1f338;1、Linux线程同步&#x1f368;1.1、同步概念与竞态条件&#x1f367;1.2、条件变量&#x1f33a;2、条件变量相关API&#x1f368;2.1、初始化和销毁条件变量&#x1f367;2.2、阻塞等待条件满足&#x1f383;2.3、唤醒阻塞等待的条件变量&…

2023 年第一弹, Flutter 3.7 发布啦,快来看看有什么新特性

核心内容原文链接&#xff1a; https://medium.com/flutter/whats-new-in-flutter-3-7-38cbea71133c 2023 年新春之际&#xff0c; Flutter 喜提了 3.7 的大版本更新&#xff0c;在 Flutter 3.7 中主要有改进框架的性能&#xff0c;增加一些很棒的新功能&#xff0c;例如&#…

初识网络爬虫

爬虫简介 网络爬虫又称网络蜘蛛、网络机器人&#xff0c;它是一种按照一定的规则自动浏览、检索网页信息的程序或者脚本。网络爬虫能够自动请求网页&#xff0c;并将所需要的数据抓取下来。通过对抓取的数据进行处理&#xff0c;从而提取出有价值的信息。 爬虫简单来说就是是通…

Mongodb基础操作

打开Mongodb服务&#xff0c;打开Robo 3T&#xff0c;链接服务并创建数据库&#xff1a; 创建表&#xff08;集合&#xff09;&#xff1a; 双击打开一个界面&#xff1a; 添加数据 查询book表&#xff1a; 添加属性名&#xff08;新数据&#xff09;&#xff1a; 查询&#xf…

推荐算法入门:序列召回(二)

召回&#xff1a;输入一个用户的&#xff08;点击&#xff09;序列&#xff0c;通过某种方法&#xff08;序列建模的方法&#xff09;&#xff0c;把用户输入的序列变为向量&#xff0c;用用户向量&#xff0c;在所有的item的向量进行快速检索&#xff0c;依次达到序列召回的效…

Linux使用YUM源安装Docker

安装环境查看Linux版本&#xff0c;如图&#xff1a;下载docker yum源登录阿里云开源镜像站&#xff0c;地址如下&#xff1a;阿里云开源镜像站搜索docker&#xff0c;如图&#xff1a;打开docker-ce&#xff0c;如图&#xff1a;复制docker-ce源地址&#xff0c;如下&#xff…

高并发环境如何有效缓解带宽压力

网络带宽是指在单位时间&#xff08;一般指的是1秒钟&#xff09;内能传输的数据量。网络和高速公路类似&#xff0c;带宽越大&#xff0c;就类似高速公路的车道越多&#xff0c;其通行能力越强。   在持续的多用户、高并发的情况下&#xff0c;缓解带宽压力可以避免客户端卡…

IO和NIO

什么是I/O模型: 通常情况下I/O操作是比较耗时的&#xff0c;所以为了高效的使用硬件&#xff0c;应用程序可以专门设置一个线程进行I/O操作&#xff0c;而另外一个线程则利用CPU的空闲去做其他计算&#xff0c;这种为提高应用执行效率而采用的I/O操作方法称为I/O模型&#xff…

【笔记】ASP.NET Core技术内幕与项目实现:基于DDD与前后端分离

最近在写论文&#xff0c;想使用ASP.NET Core Web API技术&#xff0c;但对它还不是很熟&#xff0c;鉴权组件也没用过&#xff0c;于是在网上查找资料&#xff0c;发现了杨中科老师写的这本书&#xff08;微信读书上可以免费看&#xff09;&#xff0c;说起来我最初自学C#时看…

C++:类中const修饰的成员函数

目录 一.const修饰类的成员函数 1.问题引出&#xff1a; 代码段&#xff1a; 2.问题分析 3.const修饰类的成员函数 二. 类的两个默认的&运算符重载 三. 日期类小练习 一.const修饰类的成员函数 1.问题引出&#xff1a; 给出一段简单的代码 代码段&#xff1a; #in…

springcloud3 Sentinel的搭建以及作用

一 sentinel的概念 1.1 sentinel Sentinel是分布式系统流量控制的哨兵&#xff0c;阿里开源的一套服务容错的综合性解决方案。 主要用来处理&#xff1a; 服务降级 服务熔断 超时处理 流量控制 sentinel 的使用可以分为两个部分: 核心库&#xff08;Java 客户端&#…

【软件工程】用例图、状态图与活动图

题目要求&#xff1a; 一、投诉人对广州市燃气行业相关单位的经营和服务不满意或存在意见时&#xff0c;对燃气处或市政园林局服务监督处进行投诉。 二、燃气处投诉专管员受理直接来自投诉人或由服务监督处转来的相关投诉。 三、燃气处投诉专管员落实相关单位&#xff08;或…

DlhSoft Gantt Chart Light Library 4.3.47 Crack

DlhSoft Gantt Chart Light Library 4.3.47 改进了 Microsoft Project XML 文件的加载和图像的导出。 2023 年 1 月 24 日 - 10:09新版本 特征 改进了 Microsoft Project XML 文件的加载和从“ScheduleChartDataGrid”导出图像。 添加了新的“TotalResourceEffort”和“TotalRe…

USART 数据流控制

USART 数据流控制 也就是 USART_HardwareFlowControl 一、流控制的作用 这里讲到的 “流”&#xff0c;指的是数据流&#xff1b;在数据通信中&#xff0c;流控制是管理两个节点之间数据传输速率的过程&#xff0c;以防止出现接收端的数据缓冲区已满&#xff0c;而发送端依然继…

3.5动态规划--凸多边形的最优三角剖分

写在前面 尽管这是一个几何问题&#xff0c;但本质上与3.1-矩阵连乘极为相似 定义dp数组的含义&#xff1a;t[i][j]表述以点Vi-1&#xff0c;Vi&#xff0c;...&#xff0c;Vj为顶点的最优三角形剖分的最优权函数值 我们要计算的最优值在 t[1][n] 递归结构&#xff1a;凸多…

通过Moonbeam的Connected Contracts互连合约从Axelar转移Token至Centrifuge

将Moonbeam预编译智能合约功能与波卡指定技术交互&#xff0c;再结合Axelar通用消息传递&#xff08;GMP&#xff09;&#xff0c;能够实现其他链无法完成的独特交互。阅读本文了解Connected Contracts互连合约如何通过只与单条链交互连接Axelar的EVM链发送Token至Centrifuge等…

四、新图片、新视频预测(Datawhale组队学习)

文章目录配置环境预测新图像载入图像并进行预处理导入训练好的模型前向预测将分类结果写入原图中预测新视频导入训练好的模型视频预测单帧图像分类预测可视化方案一&#xff1a;原始图像预测结果文字可视化方案二&#xff1a;原始图像预测结果文字各类别置信度柱状图预测摄像头…

Mybatis 基本使用案例

1、基本的CRUD 1.1、新增 <!--int insertUser();--> <insert id"insertUser"> insert into t_user values(null,admin,123456,23,男) </insert> 1.2、删除 <!--int deleteUser();--> <delete id"deleteUser"> delete fro…