蓝桥杯算法 - 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.mzph.cn/news/769600.shtml

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

相关文章

今天聊聊Docker

在数字化时代&#xff0c;软件应用的开发和部署变得越来越复杂。环境配置、依赖管理、版本控制等问题给开发者带来了不小的挑战。而Docker作为一种容器化技术&#xff0c;正以其独特的优势成为解决这些问题的利器。本文将介绍Docker的基本概念、优势以及应用场景&#xff0c;帮…

1.4.2 练习

一、颠倒三角形 题目&#xff1a;修改顶点着色器让三角形上下颠倒 更改顶点着色器代码如下&#xff1a; #version 330 corelayout (location 0) in vec3 aPos; //位置变量的属性位置值为0 layout (location 1) in vec3 aColor; //颜色变量的属性位置值为1out vec3 ourColo…

项目配置之道:优化Scrapy参数提升爬虫效率

前言 在当今信息时代&#xff0c;数据是无处不在且无比重要的资源。为了获取有效数据&#xff0c;网络爬虫成为了一项至关重要的技术。Scrapy作为Python中最强大的网络爬虫框架之一&#xff0c;提供了丰富的功能和灵活的操作&#xff0c;让数据采集变得高效而简单。本文将以爬…

线程和进程有什么区别?

1、典型回答 进程&#xff08;Process&#xff09;和线程&#xff08;Thread&#xff09;是操作系统中两个重要的概念&#xff0c;都是用来执行任务的&#xff0c;它们的定义如下&#xff1a; 进程是指计算机中正在运行的程序的实例。每个进程都有自己的地址空间、内存、文件…

生成词云...

import wordcloud import jieba import PIL import numpy as np import matplotlib.pyplot as plt import jieba.analyse image_background PIL.Image.open(/home/back/pythonclass/11.jpg) #遮罩 MASK np.array(image_background) txtopen("/home/back/pythoncla…

如何本地部署Imagewheel并实现无公网IP远程连接打造个人云图床

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

Mysql数据库——数据备份与恢复

目录 一、数据备份的重要性 二、数据库备份的分类 1.从物理与逻辑的角度分类 2.从数据库的备份策略角度&#xff0c;备份可分为 2.1完全备份 2.2差异备份 2.3增量备份 2.4总结 三、常见的备份方法 四、Mysql数据库完全备份 1.完全备份定义 2.优缺点 3.数据库完全备…

2024南京人工智能展会:定于2024年11月份在南京国际博览中心举行

2024南京国际人工智能展览会&#xff0c;拟定于2024年11月份在南京国际博览中心隆重召开。这一盛大的科技盛宴&#xff0c;无疑将为全球人工智能领域注入新的活力&#xff0c;推动科技创新与社会进步。 此次展览会将以“智能未来&#xff0c;共创辉煌”为主题&#xff0c;汇聚全…

Hbase 王者荣耀数据表 HBase常用Shell命令

大数据课本&#xff1a; HBase常用Shell命令 在使用具体的Shell命令操作HBase数据之前&#xff0c;需要首先启动Hadoop&#xff0c;然后再启动HBase&#xff0c;并且启动HBase Shell&#xff0c;进入Shell命令提示符状态&#xff0c;具体命令如下&#xff1a; $ cd /usr/local…

解决论文中插入图片显示不完整

点击图片-开始&#xff0c;找到段落中右下角 将行距改为单倍行距

CDP7 下载安装 Flink Percel 包

下载链接&#xff1a;https://www.cloudera.com/downloads/cdf/csa-trial.html 点击后选择版本&#xff0c; 然后点击download now&#xff0c;会有一个协议&#xff0c;勾选即可&#xff0c;然后就有三个文件列表&#xff0c; 我这里是已经注册登录的状态&#xff0c;如果没…

链式二叉树经典OJ题目(一)

目录 结构体声明&#xff1a; 1.单值二叉树 题目描述&#xff1a; 思路分析&#xff1a; 源码&#xff1a; 2.二叉树最大深度 题目描述&#xff1a; 思路分析&#xff1a; 源码&#xff1a; 3.检查两棵树是否相同 题目描述&#xff1a; 思路分析&#xff1a; 源码…

YOLOv9改进策略:卷积魔改 | SCConv:空间和通道重建卷积,即插即用,助力检测 | CVPR2023

&#x1f4a1;&#x1f4a1;&#x1f4a1;本文改进内容&#xff1a; CVPR2023 SCConv 由两个单元组成&#xff1a;空间重建单元&#xff08;SRU&#xff09;和通道重建单元&#xff08;CRU&#xff09;。 SRU利用分离重建方法来抑制空间冗余&#xff0c;而CRU使用分割-变换-融…

Linux文件系列:磁盘,文件系统,软硬链接

Linux文件系列:磁盘,文件系统,软硬链接 一.磁盘相关知识1.磁盘机械构成2.磁盘物理存储3.磁盘逻辑存储1.LBA地址2.磁盘的分区和分组 二.文件系统和inode1.inode结构体2.文件系统1.Super Block(超级块)2.Group Descriptor Table(块组描述表GDT)3.inode Table4.Data Blocks5.Block…

mysql面试,事务四大特性,mvcc版本控制,3个重要日志,索引结构,索引失效,innodb引擎执行流程,主从复制,锁,page页

大纲 事务4大特性 https://blog.csdn.net/king_zzzzz/article/details/136699546 Mvcc多版本控制 https://blog.csdn.net/king_zzzzz/article/details/136699546 3个重要日志 https://blog.csdn.net/king_zzzzz/article/details/136868343 索引 mysql 索引&#xff08;…

家用智能洗地机哪个牌子好?4款型号让你解锁高效省力生活体验

在今天的社会中&#xff0c;随着生活节奏的加快&#xff0c;人们对于家庭清洁的需求不断增加。传统的清洁方法已经无法满足现代家庭的需求。因此&#xff0c;洗地机作为一种高效、方便的清洁工具&#xff0c;已经成为了许多家庭首选的清洁设备。然而&#xff0c;在市场上&#…

RSTP、MSTP、VRRP

RSTP协议原理与配置 问题一、STP的收敛延时&#xff08;30秒&#xff08;有BP端口情况下RP端口down&#xff09;或者50秒&#xff08;没有BP端口情况下RP端口down&#xff09;&#xff09; RSTP&#xff1a;Rapid Spanning Tree Protocol RSTP和STP从原理流程上一样&#xf…

【刷题】滑动窗口精通 — Leetcode 30. 串联所有单词的子串 | Leetcode 76. 最小覆盖子串

送给大家一句话&#xff1a; 充满着欢乐与斗争精神的人们&#xff0c;永远带着欢乐&#xff0c;欢迎雷霆与阳光。 —— 赫胥黎 滑动窗口精通 前言Leetcode 30. 串联所有单词的子串题目描述算法思路 Leetcode 76. 最小覆盖子串题目描述算法思路 Thanks♪(&#xff65;ω&#xf…

QT 信号(Signal)与槽(Slot)机制

一、信号&#xff08;signal&#xff09;与槽&#xff08;slot&#xff09; 在QT中&#xff0c;信号&#xff08;signal&#xff09;与槽&#xff08;slot&#xff09;机制是一种用于对象间通信的重要机制。它允许一个对象发出信号&#xff0c;而其他对象可以通过连接到该信号…

一文读懂OLAP常用优化技术

概述 OLAP在推动企业数字化转型、提高决策分析效率等场景占了举足轻重的作用。市场上数仓选型非常多&#xff0c;升级后往往也越来越像。因为OLAP底层技术有很多共通之处&#xff0c;本文将揭秘其中一些常用的技术手段。期望能帮助读者更好地进行技术选型和数仓设计。 笔者将…