蓝桥杯算法 - DP

上一篇:[[蓝桥杯算法-排序、递归、全排列]]

动态规划(dp)

dp即动态规划,常用于:数学,计算机科学,管理学,经济和生物信息学。
dp在生活中也很常见,如:你今天有很多任务,你从中需要找到一种最优的方式去解决,这就是dp。

什么是dp

dp就是一种分为治之的思想,通过将一个大的问题分解成为一个个小问题,然后通过求得小问题的解来最终解决这个大的问题。
特征:

  • 分解问题
  • 解决子问题
  • 组合子问题的解
  • 避免重复

核心思想:

  • 拆分子问题
  • 记住过程
  • 避免重复运算

例子:

  • 1+1+1+1+1+1 = ? 6
  • 如果在左边直接+1 ,那么结果是多少?
  • 因为之前已经得到了结果。所以能够根据结果直接+1得到答案。

自顶而下求解递归 经典例题(青蛙跳台阶)

一只青蛙,一次可以跳上1级台阶,一次也可以跳上2级台阶。求跳上10级台阶,共有多少种跳法。

思路分析:

  • 要跳上第10层台阶,可以从第9层跳一个台阶或者从第8层跳2个台阶。
  • 要跳上第9层台阶,可以从第8层跳一个台阶或者从第7层跳2个台阶
  • ·······

假设跳上第n级台阶的跳法是f(n),那么:

  • f(10) = f(9)+f(8)
  • f(9) = f(8)+f(7)
  • ···
  • f(2) = 2 //2种跳法
  • f(1) = 1

上述过程为拆分子问题的过程,将跳上第10层的方法 = 跳上第9层+跳上第8层

代码思路:

  • 使用递归求解
  • 结束条件是 等于1或者等于2的时候 返回1 或者2
  • 递归函数是 Fn(n-1)+Fn(n-2);即返回条件

代码如下:

package test01;
public class Main_P19 {
	public static void main(String[] args) {
		int result = jump(10);
		System.out.println("所有跳法一共有:"+result+"种");
	}
	public static int jump(int n) {
		if(n == 1) {
			return 1;
		}
		if(n == 2) {
			return 2;
		}
		return jump(n-1)+jump(n-2);   //例如第10层台阶就有 从第九层跳一个台阶和从第8层跳2个台阶  这两种方法的和
	}
}

dp如何改进

  • 使用字典:上述题目是使用递归来解决的,那么不可避免会出现运行时间长的问题。那么如何解决的呢?那就是使用字典来存储运行结果[[蓝桥杯算法-排序、递归、全排列#^fc4363]] 。
  • 上述使用字典就对应了dp中的“记住过程”这个核心思想。(使用数组和map(键值对))

青蛙跳台阶优化

优化思路:

  • 使用字典来进行优化算法运行时间
  • 使用map字典

代码如下:

public static void main(String[] args) {
		HashMap<Integer, Integer> map = new HashMap<>(); //定义map来存储递归的结果
		long l1 =  System.currentTimeMillis();
		int result = jump(40,map);
		long l2 =  System.currentTimeMillis();
		System.out.println("所有跳法一共有:"+result+"种");
		System.out.println(l2-l1);
	}
	public static int jump(int n ,HashMap<Integer, Integer> map) {
		//如果包含为n的键,则返回值
		if(map.containsKey(n)) {
			return map.get(n);
		}else {
			
		}
		if(n == 1) {
			return 1;
		}
		if(n == 2) {
			return 2;
		}
		//例如第10层台阶就有 从第九层跳一个台阶和从第8层跳2个台阶  这两种方法的和
		int result =  jump(n-1,map)+jump(n-2,map);   //用result来存储值
		//将值添加到map
		map.put(n, result);
		return result;
	}

因为动态规划就是将问题拆分成为子问题,那个原来这个大的问题的时间复杂度=小问题花费的时间×小问题的个数

这个的字典可以选择map,list,数组等来存贮。

动态规划和递归

动态规划和递归有区别,但是解题方法类似:

  • 递归是自上而下的:从f(10) -> f (1)
  • 动态规划是自下而上的:从 f(1) -> f(10)

动态规划dp解题步骤

  • 最优子结构:如 f(10) = f(9)+ f(8) 那么 9和8就是最优子结构,就是构成f10的最简化的结构
  • 状态转移方程:原问题和拆分问题的转化关系,用一个方程表示:f10 = f9+f8
  • 边界:我认为就是结束条件。如f1 = 1 和 f2 = 2 就是结束条件。到次时候递归结束。动态规划运算也结束。
  • 重叠子:运算中出现的重叠部分。如 f10 = f9+f8 f9 = f8 + f7 在这部分运算当中重叠子就是 f8

优化:在这里插入图片描述

使用for循环来解决了问题

代码如下:

public class Main_P21 {
	public static void main(String[] args) {
		System.out.println(ways(10));
	}
	public static int ways(int n) {
		if(n == 1) {
			return 1;
		}
		if(n ==2 ) {
			return 2;
		}
		int a = 1, b = 2, temp = 0;
		for (int i = 3; i <= n; i++) {
			temp = a+b;
			a = b;
			b = temp;
		}
		return temp;
	}
}

动态规划的解题思路

什么样的问题适合动态规划?

  • 如果一个问题能够把所有答案穷举出来,并且存在重叠子,那么它适合用动态规划来解决。

动态规划的经典应用场景:

  • 最长增长子序列
  • 最小(大)距离
  • 背包问题
  • 凑零钱问题
  • 等等

动态规划的解题思路:

  • 核心思想:拆分子问题,记住过程,减少重叠子运算。
  • 穷举分析:就是把所有可能性都分析列举出来。
  • 确定边界:就是找到结束的条件
  • 写出状态转移方程:即主问题和子问题的关系式
  • 代码实现

BFS广度优先搜索

例题:数字三角形

!在这里插入图片描述

思路分析:

  • 先用一个二维数组来存储数据 第一行一个数字,第二行2个数字····· 我们使用双重for循环来完成
  • 只能加上左边或者右边的数字,那么就进行判断
  • 如何求和呢,那么久累加,让上面一层数字加上下面左边或者右边的数字,那么最终两两比较再相加就能得到最大的数字

代码如下:

import java.util.Scanner;

public class Main_P22 {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);  //输入
		System.out.println("请输入行数:");
		int n = scanner.nextInt();  //输入整数
		
		int [][] a = new int [n] [n]; //创建大小为 n 行 n 列的矩阵
		//输入矩阵数据
		for(int i = 0 ; i<n ; i++) {
			for(int j = 0 ;j<=i;j++) {
				a [i][j] = scanner.nextInt();
			}
		}
		//从第四行开始选择较大的数,然后主键从第到高
		for (int i = n-1; i > 0 ; i--) {
			for(int j = 0 ;j<i;j++) {
				//滚动数组最后a[0][0]为最大的和
				//选出左下角或者右下角大的数加上赋值给a[i-1][j]
				if((a[i-1][j]+a[i][j])  >  (a[i-1][j]+a[i][j+1])) {
				a[i-1][j]+=a[i][j]; //加上左边的
			}else {
				a[i-1][j]+=a[i][j+1];//加上右边的
			}
		}
	}
		System.out.println("最终最大和为:"+a[0][0]);
		
}
}

DFS深度优先搜索

欢迎关注!!!

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

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

相关文章

【随笔】oh-my-posh(Windows power shell为例)

Oh My Posh 是一个适用于任何 shell 的自定义提示引擎&#xff0c;能够使用函数或变量调整提示字符串。 文章目录 一、安装oh-my-posh二、安装Nerd 字体三、oh-my-posh 初始化四、更换主题 一、安装oh-my-posh GitHub repo&#xff1a;https://github.com/JanDeDobbeleer/oh-m…

情感视频素材怎么来的?(情感语录的视频素材在哪里找)

很多小伙伴觉得情感类型的短视频账号用户多&#xff0c;都想要进入分一杯羹&#xff0c;那么这些创作素材去哪里找呢&#xff0c;下面分享几个非常使用的找情感短视频素材的办法。 1&#xff0c;蛙学网 说到情感视频素材的短视频&#xff0c;作为一个专业的短视频素材网站&am…

2024年云服务器ECS价格表出炉——腾讯云

腾讯云服务器多少钱一年&#xff1f;61元一年起。2024年最新腾讯云服务器优惠价格表&#xff0c;腾讯云轻量2核2G3M服务器61元一年、2核2G4M服务器99元一年可买三年、2核4G5M服务器165元一年、3年756元、轻量4核8M12M服务器646元15个月、4核16G10M配置32元1个月、312元一年、8核…

nodeJs中实现连表查询

nodeJs中实现连表查询 router.post(/getOrder, async function(req, res, next) {let userId req.body.phone;let sql select * from orders where userId?;let orders await new Promise((resolve, reject) > {connection.query(sql, [userId], function(error, resul…

一分钟在Solana链创建代币教程

只需要 1 分钟就可以创建自己的SOLANA代币 1、连接Solana钱包2、填写代币信息创建3、创建成功 Solana 是一个基于区块链技术的高性能、去中心化的智能合约平台&#xff0c;旨在为开发者提供高度可扩展和低成本的区块链基础设施。通过其创新的共识机制和高吞吐量的网络架构&…

注册中国商标的大致流程

在当今竞争激烈的商业环境中&#xff0c;商标作为企业形象和品牌标识的重要载体&#xff0c;其保护和推广至关重要。注册中国商标是拓展中国市场的关键步骤 注册中国商标需要以下基本资料&#xff1a; 商标图样&#xff1a;须清晰、完整地展示商标图案和文字内容&#xff1b;商…

MQ消息队列从入门到精通速成

文章目录 1.初识MQ1.1.同步和异步通讯1.1.1.同步通讯1.1.2.异步通讯 1.2.技术对比&#xff1a; 2.快速入门2.1.安装RabbitMQ2.2.RabbitMQ消息模型2.3.导入Demo工程2.4.入门案例2.4.1.publisher实现2.4.2.consumer实现 2.5.总结 3.SpringAMQP3.1.Basic Queue 简单队列模型3.1.1.…

大模型日报|今日必读的6篇大模型论文

大家好&#xff0c;今日必读的大模型论文来啦&#xff01; 1.英伟达提出LATTE3D&#xff1a;更快、更好的“文生3D”方法 近来&#xff0c;由文本到 3D 生成的方法可以生成令人印象深刻的 3D 效果&#xff0c;但这个过程需要耗时的优化过程&#xff0c;每个提示&#xff08;p…

AI之Suno:Suno V3的简介、安装和使用方法、案例应用之详细攻略

AI之Suno&#xff1a;Suno V3的简介、安装和使用方法、案例应用之详细攻略 目录 Suno AI的简介 1、特点与改进&#xff1a; Suno AI的安装和使用方法 1、第一步&#xff0c;让国产大模型—ChatGLM4帮我写一个提示词 2、第二步&#xff0c;将提示词交给Suno v3&#xff0c;…

TikTok vs Instagram!哪个广告形式更适合你

近几年&#xff0c;TikTok以短视频和创新性吸引不少年轻受众&#xff0c;在广告方面也提供挑战赛、创意滤镜和名人合作等多种方式&#xff0c;自2019年起迅速增长&#xff0c;成为Instagram的强劲对手&#xff0c;连续三年下载量居首。而Instagram则拥有十多年历史和庞大用户基…

人工智能(Educoder)-- 搜索技术 -- 盲目式搜索

第1关&#xff1a;盲目搜索之宽度优先搜索算法 任务描述 本关任务&#xff1a;给定迷宫地图以及在迷宫中的起始位置&#xff0c;利用宽度优先搜索算法求解走出迷宫的最短路径长度&#xff0c;走出迷宫意味着达到迷宫地图的边界&#xff08;所有位置下标0开始&#xff09;。 …

安卓工控一体机主板定制_联发科MTK平台解决方案

新移科技安卓工控一体机方案基于MT8766主芯片&#xff0c;采用四核 Cortex-A53 CPU&#xff0c;搭载Android 12.0系统&#xff0c;主频高达2.0GHz&#xff0c;具有低功耗和高性价比的优势。搭载ARM IMG GE8300 高性能GPU和4G全网通版本的RF&#xff0c;网络连接稳定快速。 可直…

Linux调试器-gdb

一、背景 程序的发布方式有两种&#xff0c;debug模式和release模式 debug模式&#xff1a;编译器形成可执行程序的时候会给可执行程序添加调试信息 程序员调试时使用debug模式&#xff0c;而release模式用于测试 而gcc/g默认编译&#xff0c;采用release模式 用gcc/g使用…

智能建筑:基于IT的集成和融合解决方案

智能建筑( Intelligent Building) 定义: 以建筑为平台,兼备建筑设备、办公自动化及通信网络系统,集结构、系统、服务、管理及它们之间的最优化组合,向人们提供一个安全、高效、舒适、便利的建筑环境。 智能建筑的发展历史: -产生:1984年世界上第一座智能大厦诞生于美国…

基于yolov8安全帽检测的系统

基于yolov8安全帽检测的系统 项目描述&#xff1a; 安全头盔检测&#xff08;计算机视觉&#xff09; 1.自训练数据集1538张数据图片&#xff0c;进行标注&#xff0c;并进行100轮的训练&#xff0c;准确率达0.966 2.使用 Flask 和 Ultralytics YOLOv8 模型开发了一个 Web 应…

【开发环境搭建篇】NodeJS的安装和配置

作者介绍&#xff1a;本人笔名姑苏老陈&#xff0c;从事JAVA开发工作十多年了&#xff0c;带过大学刚毕业的实习生&#xff0c;也带过技术团队。最近有个朋友的表弟&#xff0c;马上要大学毕业了&#xff0c;想从事JAVA开发工作&#xff0c;但不知道从何处入手。于是&#xff0…

C++ STL-string 类使用超详解

目录 0. 引言 1. string 类 1.1 string类的基本概念 1.2 string类与char*的区别 1.3 string类的作用 2. string 的接口使用 2.1 string 类对象的默认成员函数 2.1.1 构造函数 - 初始化 2.1.2 npos 含义 2.2 赋值重载 - 初始化 2.3 析构函数 2.2 string 类对象的访问和…

目前服务器2核4G支持多少人同时访问?性能如何?

腾讯云轻量应用服务器2核4G5M配置性能测评&#xff0c;腾讯云轻量2核4G5M带宽服务器支持多少人在线访问&#xff1f;并发数10&#xff0c;支持每天5000IP人数访问&#xff0c;腾讯云百科txybk.com整理2核4G服务器支持多少人同时在线&#xff1f;并发数测试、CPU性能、内存性能、…

Qt 窗口MainWindow(下)

对话框 对话框是 GUI 程序中不可或缺的组成部分。一些不适合在主窗口实现的功能组件可以设置在对话框中。对话框通常是一个顶层窗口&#xff0c;出现在程序最上层&#xff0c;用于实现短期任务或者简洁的用户交互。Qt 常用的内置对话框有: QFiledialog (文件对话框)、QColorDi…

36.基于SpringBoot + Vue实现的前后端分离-高校汉服租赁网站系统(项目 + 论文)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的高校汉服租赁网站系统设计与实现管理…
最新文章