蓝桥杯算法 - 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来存储值//将值添加到mapmap.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.hqwc.cn/news/568471.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

边缘计算网关在机械制造企业的应用效果和价值-天拓四方

随着智能制造行业的飞速发展&#xff0c;数据量的激增和实时性要求的提高&#xff0c;传统的数据处理方式已经难以满足生产需求。而边缘计算网关的出现&#xff0c;为智能制造行业带来了革命性的变化。下面&#xff0c;我们将通过一个具体案例展示边缘计算网关在智能制造行业的…

数据库高级查询【mysql】

数据库高级查询【数据库】 前言版权推荐数据库高级查询行转列统计数据 CASE WHEN 条件 THEN 结果1 ELSE 结果2 END数据库查询带排名建表查询带排名&#xff0c;排名连续查询带排名&#xff0c;排名不连续查询带排名&#xff0c;按行号 Mysql数据库函数常用函数最后 前言 2024-…

Docker进阶:Docker Swarm(集群搭建) —实现容器编排的利器

Docker进阶&#xff1a;Docker Swarm&#xff08;集群搭建&#xff09; —实现容器编排的利器 1、什么是Docker Swarm&#xff1f;2、Docker Swarm 与 Docker Compose的区别3、创建一个Swarm集群&#xff08;1-Manager&#xff0c;2-Worker&#xff09;1、资源准备2、初始化Swa…

QT环境搭建

学习QT 一、QT环境搭建二、QT的SDK下载三、认识QT SDK 中自带的一些程序 一、QT环境搭建 QT开发环境&#xff0c;需要安装三个部分。 c编译器&#xff08;gcc、cl.exe……不是visual studio&#xff09;QT SDK&#xff08;QT SDK里面已经内置了C编译器&#xff1b;SDK就是软件…

迅雷网盘拉新项目,一手接单渠道(附新人操作教程)

一、 星子助推-迅雷拉新项目介绍 &#xff08;一&#xff09;项目优势 1、 网盘功能强大&#xff1a;作为国内比较早的网盘产品&#xff0c;支持市面上包括安装包、压缩包、图片、视频、文档基本上所有格式的文件都可以放在迅雷云盘上&#xff0c;用户下载和转存方便。 2、 …

使用WebClient发起网络请求

目录 1、导入对应的pom 2、编写WebClientUtil请求工具类 3、使用WebClientUtil发起请求 使用WebClient的优点&#xff1a;支持lambdas 的函数&#xff1b;支持更高的并发性和更少的硬件资源&#xff1b;支持同步和异步&#xff1b;支持流式传输。具体的使用方式如下&#xff1a…

单片机入门到精通:一站式在线学习平台!

介绍&#xff1a;单片机&#xff0c;也称为微控制器&#xff08;MCU&#xff09;&#xff0c;是一种集成了中央处理器&#xff08;CPU&#xff09;、随机存储器&#xff08;RAM&#xff09;、只读存储器&#xff08;ROM&#xff09;以及输入/输出接口于单一芯片上的微型计算机。…

【数据库】SQL Server 2008 R2 安装过程

启动安装程序&#xff0c;点击setup&#xff0c;进入【SQLServer安装中心】 点击界面左侧的【安装】&#xff0c;然后点击右侧的【全新SQLServer独立安装或向现有安装添加功能】&#xff0c;进入【SQLServer2008R2安装程序】界面&#xff0c;如下图所示&#xff1a; 进入【安装…

SQL复习专题

请结合B站-技术蛋老师 视频学习 核心语法 一、增&#xff1a;数据库/表格 create create database 数据库名&#xff1b;#创建表&#xff08;列名类型&#xff09; mysql> create table eggs_record(-> id int,-> egg_name varchar(10),-> sold date-> ); 这…

hcip复习总结2(广域网与OSPF)

数据链路层面&#xff1a; 针对不同的物理链路定义不同的封装 局域网封装&#xff1a; Ethernet 2 &#xff08; TCP/IP &#xff09; &#xff0c; IEEE802.3 &#xff08; OSI &#xff09; 广域网封装&#xff1a; PPP HDLC FR ATM HDLC &#xff1a; 高级数据链路控制协…

WPF —— Expander折叠栏 、菜单标签 menu

Expander 1 &#xff1a;Expander折叠栏 简介 Expander控件有一个箭头按钮。单击箭头时&#xff0c;Expander中的子元素将显示或隐藏。箭头“展开”控件&#xff0c;使其子控件可见。 2 &#xff1a;Expander常用的属性 IsEnabled 默认是打开或者折叠起来&#xff0c;true就…

漏洞挖掘 | EDU小通用漏洞分享

1.信息搜集 首先就是信息搜集&#xff0c;挖edu没账号怎么办呢&#xff1f;sg妹子不行&#xff0c;咱就找能自己注册的站。 Hunter&#xff1a;web.title”XX大学”&&web.body”注册” Fofa&#xff1a;host”.edu.cn” && body”注册” && country”…