算法——深度优先搜索(DFS)

DFS

  • 思路:
    • 从初始状态出发,下一步可能有多种状态;选其中一个状态深入,到达新的状态;直到无法继续深入,回退到前一步,转移到其他状态,然后再深入下去。最后,遍历完所有可以到达的状态,并得到最终的解。
    • DFS通常使用递归来实现
  • 弊端:
    • 递归容易超时
  • 大部分DFS搜索的题目都需要用到回溯的思路,其难度主要在于扩展子结点时如何构造停止递归并返回的条件。 

递归

  •  递归方法就是直接或间接地调用其自身

  •  注意:

    • 避免进入死循环

    • 容易超时

      • 递归 <——> 非递归,相互转化

回溯法

  • 回溯法是一种采用深度优先方式进行搜索的算法,当搜索到某一步时,如果发现原先的选择不是最优选择或者达不到目标,就退回一步重新选择。
  • 剪枝函数:(在回溯中用于减少子结点扩展的函数)
    • 1、约束函数:是问题的可行解吗?
    • 2、限界函数:确定是问题的可行解,但,是问题的最优解吗?
  • 解题步骤:
    • 1、如何递归
    • 2、如何剪枝与回溯

一、计算阶乘(递归)

阶乘函数:n!=\left\{\begin{matrix} 1 &,n=0 \\ n\times (n-1)! & ,n> 0 \end{matrix}\right.

比如

  • 3!=6
    • 3!= 3*2*1 = 6
  • 4!=24
    • 4!= 4*3*2*1 = 24
  • 5!=120
    • 5!= 5*4*3*2*1 = 120

分析:

  •  
package no1_1;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		int n = input.nextInt();
		System.out.println(factorial(n));
	}
	public static int factorial(int n) {
		if(n==0) {
			return 1;
		}else {
			return n*factorial(n-1);
		}
	}
}

二、数字游戏(回溯)

  给定一个1~N的排列a[i],每次将相邻两个数相加,得到新序列,再对新序列重复这样的操作,显然每次得到的序列都比上一次的序列长度少1,最终只剩一个数字。
  例如:
  3 1 2 4
  4 3 6
  7 9
  16
  现在如果知道N和最后得到的数字sum,请求出最初序列a[i],为1~N的一个排列。若有多种答案,则输出字典序最小的那一个。数据保证有解。

分析:

package no1_1;

import java.util.Scanner;
 
public class Main {
	//main()方法是静态方法,它只能调用静态方法,所以dfs()也是静态方法
	//因为两个方法都是静态方法,所以它们共用的属性sum,N等都得是静态的
	static int sum;
	static int N;
	static int arr1[];
	static boolean flag = true;
 
	public static void main(String[] args) {
		Scanner input = new Scanner(System.in);
		N = input.nextInt();
		sum = input.nextInt();
		int array[] = new int[N];
		int usedArray[] = new int[N + 1];
		//开始递归
		dfs(0, array, usedArray, flag);
	}
 
	public static void dfs(int step, int arr[], int usedArray[], Boolean flag) {
		//首先检查当前步数是否等于N,如果是,则表示已经生成了一个完整的排列(最顶层,有N个数的数组)
		if (step == N) {
			//复制该排列到新数组中
			int arr1[] = new int[N];
			for (int i = 0; i < N; i++) {
				arr1[i] = arr[i];
			}
			//从上往下,计算该排列最终得到的数字
			for (int i = 1; i < N; i++) {
				for (int j = 0; j < N - i; j++) {
					arr1[j] = arr1[j] + arr1[j + 1];
				}
			}
			//某排列计算出的数字与题目符合
			if (arr1[0] == sum) {
				//把该排列输出到控制台
				for (int x : arr) {
					System.out.print(x + " ");
				}
				//停止递归
				flag = false;
				//回溯,但不再递归
				return;
 
			} else
				//条件不满足,
				//回溯,继续递归生成下一步的排列
				return;
		}
		//继续递归,生成可能的排列
		if (flag == true) {
			//最初序列arr[i],为1~N的一个排列
			//在递归生成排列时,使用usedArray数组来标记已经使用过的数字,避免重复使用
			for (int i = 1; i <= N; i++) {
				if (usedArray[i] == 0) {
					arr[step] = i;
					usedArray[i] = 1;
					dfs(step + 1, arr, usedArray, flag);
					usedArray[i] = 0;//取消标记
				}
			}
		}
		return;
	}
}
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【12.20】转行小白历险记 登录+注册页

一、登录注册页面逻辑 写样式布局&#xff1a;垂直居中、编程式路由、调后端接口正则表达式验证用户输入的密码规则校验通过后&#xff0c;跳转页面js兜底校验调后端接口将token值存储到vuex中&#xff0c;实现持久化存储 vuex不是持久化存储的&#xff0c;如果需要持久化存储…

IDEA的facets和artifacts

在软件开发领域&#xff0c;IDEA 是指 JetBrains 公司的 IntelliJ IDEA&#xff0c;是一款流行的集成开发环境&#xff08;Integrated Development Environment&#xff09;。在 IntelliJ IDEA 中&#xff0c;"facets" 和 "artifacts" 是两个概念&#xff…

力扣面试经典题之二叉树

104. 二叉树的最大深度 简单 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3示例 2&#xff1a; 输入&#xf…

【LearnOpenGL基础入门——4】绘制几何图形

目录 一.元素缓冲对象 二.线框模式绘制(Wireframe Mode) 三.绘制两个彼此相连的三角形 一.元素缓冲对象 元素缓冲对象(Element Buffer Object&#xff0c;EBO)&#xff0c;也叫索引缓冲对象(Index Buffer Object&#xff0c;IBO)。假设我们不再绘制一个简单三角形而是绘制一…

51单片机项目设计:基于51单片机 无线防盗报警器设计

文章目录 项目背景一、项目功能二、材料选择三、接收设备原理图设计四、发送设备原理图设计四、PCB设计五、程序设计 哔哩哔哩视频链接&#xff1a; https://www.bilibili.com/video/BV1Wc411C7xH/?vd_sourcee5082ef80535e952b2a4301746491be0 实物链接&#xff1a;https://m…

机场信息集成系统系列介绍(7):机场航班信息显示系统FIDS

目录 一、简介 二、架构及相关功能 1、实时更新和显示航班信息 2、多屏显示与查询 3、提供登机口导航信息 4、发布机场公告 5、集成机场的其他延伸服务 6、支持多语言显示 7、监控与故障处理 8、数据分析与优化 9、与航空公司、地面代理的信息交互 10、安全保障与应…

大模型工具_awesome-chatgpt-prompts-zh

https://github.com/PlexPt/awesome-chatgpt-prompts-zh 1 功能 整体功能&#xff0c;想解决什么问题 ChatGPT 中文调教指南&#xff1a;提供一些常用的使用场景及对应的 Prompt 提示 当前解决了什么问题&#xff0c;哪些问题解决不了 针对想解决实际问题&#xff0c;但不知道…

WebAssembly 的魅力:高效、安全、跨平台(上)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

若依vue如何展示一个HTML页面(或者展示Markdown文档)

一. 前言 ⚠ 本文是展示Markdown的方法,不能直接前端编辑Markdown文档. 二. 准备部分 用Typora编辑器打开需要导出html页面,我这里使用Typora来导出 1. 先将md文件导出成html 2. 将导出好的文件放在若依vue的pubilc下(文件可以是中文) 三. 代码部分 1.使用v-html来展示HT…

目标检测应用场景—数据集【NO.23】路面缺陷检测数据集

写在前面&#xff1a;数据集对应应用场景&#xff0c;不同的应用场景有不同的检测难点以及对应改进方法&#xff0c;本系列整理汇总领域内的数据集&#xff0c;方便大家下载数据集&#xff0c;若无法下载可关注后私信领取。关注免费领取整理好的数据集资料&#xff01;今天分享…

Pycharm解释器的配置: System Intgerpreter 、Pipenv Environment、Virtualenv Environment

文章目录 前提1. 环境准备2. 了解虚拟环境 一、进入Interpreter设置页二、添加Interpreter1. 方式一2. 方式二 三、 System Interpreter四、 Pipenv Environment前提条件&#xff1a;详细步骤1&#xff09; 选择pipenv2&#xff09; 设置Base Interpreter3&#xff09; 设置Pip…

opencv入门到精通——图像的几何变换

目录 目标 变换 缩放 平移 旋转 仿射变换 透视变换 目标 学习将不同的几何变换应用到图像上&#xff0c;如平移、旋转、仿射变换等。 你会看到这些函数: cv.getPerspectiveTransform 变换 OpenCV提供了两个转换函数cv.warpAffine和cv.warpPerspective&#xff0c;您…

【Linux/gcc】C/C++——编译过程

前提&#xff1a;WSL2&#xff08;Ubuntu&#xff09;、gcc编译器。gcc安装命令&#xff1a; sudo apt-get install gcc 查看gcc版本&#xff1a; 目录 1、编译过程 1.1、预处理 1.2、编译与汇编 1.3、链接 2、gcc实验 2.1、预处理 2.2、编译 2.3、汇编 2.4、链接 1、…

软件体系结构复习

数据持久化 ORM基本概念 对象关系映射&#xff08;Object Relational Mapping&#xff0c;简称ORM&#xff09;模式是为了解决面向对象和关系数据库存在的互不匹配的现象的技术。 换言之&#xff0c;ORM是通过使用描述对象和数据库之间映射的元数据&#xff0c;把程序中的对象…

使用OpenCV4实现工业缺陷检测的六种方法

目录 1 机器视觉2 缺陷检测3 工业上常见缺陷检测方法 1 机器视觉 机器视觉是使用各种工业相机&#xff0c;结合传感器跟电气信号实现替代传统人工&#xff0c;完成对象识别、计数、测量、缺陷检测、引导定位与抓取等任务。其中工业品的缺陷检测极大的依赖人工完成&#xff0c;…

前端 JS 安全对抗原理与实践

作者&#xff1a;vivo 互联网安全团队- Luo Bingsong 前端代码都是公开的&#xff0c;为了提高代码的破解成本、保证JS代码里的一些重要逻辑不被居心叵测的人利用&#xff0c;需要使用一些加密和混淆的防护手段。 一、概念解析 1.1 什么是接口加密 如今这个时代&#xff0c;…

三级安全教育二维码的应用

三级安全教育是指公司、项目经理部、施工班组三个层次的安全教育&#xff0c;是工人进场上岗前必备的过程&#xff0c;属于施工现场实名制管理的重要一环&#xff0c;也是工地管理中的核心部分之一&#xff0c;目前很多公司已经逐步开始使用系统来进行管理&#xff0c;下面我们…

pycharm git 版本回退

参考 https://blog.csdn.net/qq_38175912/article/details/102860195 yoyoketang 悠悠课堂

Redis可视化工具Redis Desktop Manager mac功能特色

Redis Desktop Manager mac是一款非常实用的Redis可视化工具。RDM支持SSL / TLS加密&#xff0c;SSH隧道&#xff0c;基于SSH隧道的TLS&#xff0c;为您提供了一个易于使用的GUI&#xff0c;可以访问您的Redis数据库并执行一些基本操作&#xff1a;将键视为树&#xff0c;CRUD键…

计算机毕业设计------JSP教务处学生成绩管理系统

项目介绍 本项目包含管理员、教师、学生三种角色&#xff1b; 用户角色包含以下功能&#xff1a; 修改密码,查看自己的信息,查看自己的成绩,登录界面等功能。 管理员角色包含以下功能&#xff1a; 修改示例,增删改查学生信息,增删改查教师信息,增删改查课程信息,管理员修改…