蓝桥杯算法 - DP

news2024/11/24 10:35:56

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

动态规划(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.coloradmin.cn/o/1546024.html

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

相关文章

vue前端标准

此文档的目的是让前端和产品、服务端开发&#xff0c;相互之间形成一种默契。 比如一些通用设计&#xff0c;不需要产品去说明&#xff0c;我们默认怎么做。 以及&#xff0c;我们开发之间的默契。 期盼大家的补充 开发原则&#xff1a; 感谢各位开发大佬共建原则&#xf…

STM32 ESP8266模块的曲折探索

这是本文的配套资料&#xff0c;最终工程请参考 新_ESP8266资料\stm32f103成功移植的项目 【免费】stm32f103c8t6esp8266资料资源-CSDN文库 一、等到了ready 产品参数 我使用的是ai-thinker的esp8266-01s&#xff0c;以下为产品规格书 引脚定义&#xff1a; 依据引脚定义&…

docker安装redis 6.2.7 并 远程连接

阿里云ecs服务器&#xff0c;docker安装redis 6.2.7 并 远程连接 文章目录 阿里云ecs服务器&#xff0c;docker安装redis 6.2.7 并 远程连接1. 拉取redis镜像2. 查看是否下载成功3. 挂载配置文件4. 下载reids配置文件(redis.conf)5. docker创建redis容器6. 查看redis容器运行状…

JL-34 超声波气象站 可集成多要素 集成度高、颜值高、免安装、免布线

产品概述 超声波气象站是我公司结合多年气象产品开发经验&#xff0c;根据现场实际情况开发的一款多功能自动气象站。该产品集温度、湿度、气压、风速、风向、雨量、大气压力、颗粒物和噪声等要素为一体&#xff0c;该系列产品集成度高、颜值高、免安装、免布线。 功能特点 …

038—pandas 重采样线性插补

前言 在数据处理时&#xff0c;由于采集数据量有限&#xff0c;或者采集数据粒度过小&#xff0c;经常需要对数据重采样。在本例中&#xff0c;我们将实现一个类型超分辨率的操作。 思路&#xff1a; 首先将原始数据长度扩展为 3 倍&#xff0c;可以使用 loc[] 方法对索引扩…

54、Qt/对话框、事件机制相关学习20240325

一、完善对话框&#xff0c;点击登录按钮&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和密码不匹配&#…

android h5理财(记账)管理系统eclipse开发mysql数据库编程服务端java计算机程序设计

一、源码特点 android h5理财管理系统是一套完善的WEBandroid设计系统&#xff0c;对理解JSP java&#xff0c;安卓app编程开发语言有帮助&#xff08;系统采用web服务端APP端 综合模式进行设计开发&#xff09;&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要…

TCP与UDP:传输层协议对比

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

VMware中添加使用ubuntu

提示&#xff1a;本文为学习记录&#xff0c;若有错误&#xff0c;请联系作者&#xff0c;谦虚受教。 文章目录 前言一、ubuntu安装二、下载vmwareTool三、解压文件四、解决联网失败五、linux常用命令总结 前言 打破舒适圈 一、ubuntu安装 Vmware安装流程 二、下载vmwareToo…

编程语言|C语言——C语言实现玫瑰花(情人节)

1.说明 在古希腊神话中&#xff0c;玫瑰花集爱与美于一身&#xff0c;既是美神的化身&#xff0c;又溶进了爱神的血液&#xff0c;所以它所代表的含义是爱情。 我们应该用玫瑰花来表达我们的爱意&#xff0c;但是好多的恋人都是因为异地而没有办法去买一束新鲜的玫瑰去送给自己…

Fast-Planner(三)详解后端B-Spline曲线优化

本文上接Fast-Planner的B-spline曲线生成详解&#xff0c;介绍B-spline曲线优化。如有问题&#xff0c;欢迎各位大佬评论指出&#xff0c;带着我一起进步。 三、B样条优化 初始化获得的B样条曲线只是达到了可达性检测&#xff0c;本章介绍为得到更加光滑安全的轨迹&#xff0…

训练自己的分类数据集

文章目录 1.数据集准备2. 数据集划分3.设计模型进行训练1. 随便乱写的网络2. 借鉴优秀的网络模型&#xff08;MobileNetV3&#xff09; 分析&#xff1a;练习&#xff1a; 1.数据集准备 准备你要进行分类的数据集&#xff0c;可以自己拍摄&#xff0c;可以网上进行爬取。 将不…

pdf压缩文件怎么压缩最小?一键压缩PDF

pdf文件压缩是为了减小文件大小&#xff0c;以便更轻松地共享、传输和存储文件&#xff0c;通过压缩pdf文件&#xff0c;可以减少文件占用的存储空间&#xff0c;加快文件的上传和下载速度&#xff0c;并节省带宽和存储成本;在本教程中&#xff0c;我们将介绍一些有效的方法来最…

人工智能三剑客NumPy、pandas、matplotlib和Jupyter四者之间的关系

NumPy 主要用途&#xff1a;NumPy&#xff08;Numerical Python的缩写&#xff09;主要用于处理大型多维数组和矩阵的科学计算。它提供了一个高性能的多维数组对象&#xff0c;以及用于数组操作的工具。与其他三者的联系&#xff1a;NumPy是pandas和matplotlib的基础库之一。许…

10.IO流(一)

文章目录 IO流一、File1.创建对象1.1 创建File类的对象1.2 注意1.3 绝对路径、相对路径 2.常用方法1:判断文件类型、获取文件信息3.常用方法2:创建文件、删除文件3.1 File类创建文件的功能3.2 File类删除文件的功能 4.常用方法3:遍历文件夹4.1 File类提供的遍历文件夹的功能4.2…

【JAVA】数据类型与变量(主要学习与c语言不同之处)

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;橘橙黄又青-CSDN博客 目标&#xff1a; 1. 字面常量 2. 数据类型 3. 变量 1.字面常量 在上节课 Hello…

paramiko,一个强大的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个强大的 Python 库 - paramiko。 Github地址&#xff1a;https://github.com/paramiko/paramiko 在网络编程中&#xff0c;远程操作是一项非常常见的需求&#xff0c;特别是…

QT 界面2.1

#include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {this->setWindowIcon(QIcon(":/Logo/1bc87d9b4c1ea878d5e0845257a06f7f (1).jpg")); // 图标this->setWindowTitle(&…

环境变量与进程详解

文章目录 1.进程的优先级1.1 查看优先级1.2 调制优先级 2.环境变量2.1 命令行参数2.2 环境变量 3.程序的地址空间3.1 为什么要有地址空间&#xff1f;3.2 linux的大O(1)调度算法 4.进程创建5.进程中止5.1 进程的退出码&#xff08;错误码&#xff09;5.2 进程终止的最优写法&am…

苍穹外卖Day07——总结7

前期文章 文章标题地址苍穹外卖Day01——总结1https://lushimeng.blog.csdn.net/article/details/135466359苍穹外卖Day02——总结2https://lushimeng.blog.csdn.net/article/details/135484126苍穹外卖Day03——总结3https://blog.csdn.net/qq_43751200/article/details/1363…