
搜索
深度优先搜索(DFS)与广度优先搜索(BFS)
m0_51303687
取乎其上,得乎其中;取乎其中,得乎其下;取乎其下,则无所得矣。
展开
-
学习记录 堆排序
堆(heap)是计算机科学中一类特殊的数据结构的统称。堆通常是一个可以被看做一棵树的数组对象。堆总是满足下列性质:堆中某个结点的值总是不大于或不小于其父结点的值;堆总是一棵完全二叉树。–百度百科按照父节点与子节点的关系,堆可以分为大顶堆、小顶堆。根据堆的特性,每次取出堆顶,即可完成排序,复杂度O(nlogn)。因为是完全二叉树,所以堆排序可以用数组实现,而无需建树。代码如下:#include <cstdio>#include <algorithm>#inclu.原创 2021-08-04 07:23:45 · 92 阅读 · 0 评论 -
做题记录 P1441砝码称重
题目链接原本以为这题就是简单一搜索,直接套DFS模板发现样例也能过,但后来发现只是凑巧正确。因为题目要求的是选出n-m个后,再在n-m个当中选若干个并计算能出现多少个和。选哪n-m个不确定,这部分不得不爆搜(至少我只会这样)。那在n-m个中选的过程难道也只能爆搜了吗?显然不是,我们可以用DP完成这一过程(01背包)。代码如下:#include <cstdio>#include <algorithm>const int M=22,MAXW=2001;using name原创 2021-11-26 15:29:54 · 179 阅读 · 0 评论 -
做题记录 2021.10.11 洛谷P2426删数
题目描述有N个不同的正整数数x1, x2, … xN 排成一排,我们可以从左边或右边去掉连续的i(1≤i≤n)个数(只能从两边删除数),剩下N-i个数,再把剩下的数按以上操作处理,直到所有的数都被删除为止。每次操作都有一个操作价值,比如现在要删除从i位置到k位置上的所有的数。操作价值为|xi – xk|*(k-i+1),如果只去掉一个数,操作价值为这个数的值。 问如何操作可以得到最大值,求操作的最大价值。输入格式第一行为一个正整数N;第二行有N个用空格隔开的N个不同的正整数。输出格式一行,包.原创 2021-10-11 16:23:13 · 188 阅读 · 0 评论 -
做题记录 2021.8.26 洛谷P1123取数
乍一看没有什么思路,但数据范围很小,直接枚举所有可能的起点,暴力搜索,直到某个点无法继续下去即可。结果仍然T了三个点。但不难发现只需要枚举起点在左上角4个格子(即前两行前两列)的情况即可。void dfs(int x,int y,int sum) { vis[x][y]++; state(x,y,1); //相邻的格子访问次数+1 bool f=0; for(int i=0; i<n; i++) { for(int j=0; j<m; j++) { if(!vis[i][j.原创 2021-08-26 15:52:29 · 134 阅读 · 0 评论 -
做题记录2021.5.22八数码问题
题目链接纯暴力解法:#include <cstdio>#include <algorithm>#include <cctype>#include <queue>#include <cstring>#define noexced(x,y) (x>=0&&y>=0&&x<3&&y<3)using namespace std;int org[3][3],tar[3]原创 2021-05-22 19:47:20 · 127 阅读 · 1 评论 -
DFS算法学习笔记1
定义:深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次.举例说明之:下图是一个无向图,如果我们从A点发起深度优先搜索(以下的访问次序并不是唯一的,第二个点既可以是B也可以是C,D),则我们可能得到如下的一个访问过程:A->B->E(没有路了!回溯到A)->C->F->H->G->D(没有路,最终回溯到A,A也没有未访问的相邻节点,本次搜索结原创 2021-02-28 15:39:17 · 220 阅读 · 0 评论