备战秋招012(20230808)

文章目录

  • 前言
  • 一、今天学习了什么?
  • 二、动态规划
    • 1.概念
    • 2.题目
  • 总结


前言

提示:这里为每天自己的学习内容心情总结;

Learn By Doing,Now or Never,Writing is organized thinking.


提示:以下是本篇文章正文内容

一、今天学习了什么?

  • 学习了代码随想录关于动态规划的算法;
  • 还有01背包问题

二、动态规划

1.概念

「动态规划」(Dynamic Programming),适用于很多重叠子问题的场景**,每一个结果一定是由于上一个状态推导出来的,选择和状态转移**。解题步骤如下:

  • 确定dp数组(dp table)以及下标的含义;
  • 确定递推公式;
  • dp数组如何初始化;
  • 确定遍历顺序;
  • 举例推导dp数组;

01 背包问题」是指,有 n 个物品和一个最多能背负 w 重量的背包,求该背包能背负的最大重量。第 i 个物品的重量为 weight[i] ,价值为 value[i] 。

有两种解法:

  • 二维数组:
    • dp[i] [j] ,表示从下标为 [0,i] 的物品中,放进背包容量为 j 时的最大价值;
    • 确定遍历的顺序,先遍历背包容量,再去逐个遍历物品个数;
  • 一维数组:
    • dp[i] ,表示背包容量为 i 时的背包最大价值;
    • 先遍历物品,再去遍历背包容量,并且保证遍历背包容量时是从大到小的,保证物品只会被放入了一次。
    /*** - 采用二维数组解决背包问题* - 只有当当前背包的容量能放下当前物品的重量时,才需要去判断是否需要将物品放入背包中* - 按照先遍历物品,再去遍历背包容量的顺序执行*/public static int testWeightBagProblem01(int[] weight, int[] value, int bagSize) {int m = weight.length;int[][] dp = new int[m][bagSize + 1];for (int j = weight[0]; j <= bagSize; j++) {dp[0][j] = value[0];}for (int j = 1; j <= bagSize; j++) {for (int i = 1; i < m; i++) {if (j >= weight[i]) {dp[i][j] = Math.max(dp[i - 1][j], dp[i - 1][j - weight[i]] + value[i]);} else {dp[i][j] = dp[i - 1][j];}}}return dp[m - 1][bagSize];}/*** - 一维数组* - 背包容量的最大值取决于之前背包容量更小时候的最大值*/public static int testWeightBagProblem02(int[] weight, int[] value, int bagSize) {int[] dp = new int[bagSize + 1];for (int i = 0; i < weight.length; i++) {// 先遍历物品for (int j = bagSize; j >= weight[i]; j--) {// 再去遍历背包容量// 判断将此物品放入背包的结果dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]); //不放、放}}return dp[bagSize];}

2.题目

  • 509. 斐波那契数
    public int fib(int n) {if (n == 0 || n == 1) {return n;}/*** 动态规划* - dp数组* - 选择* - 状态转移* dp[i] 代表f(n)*/int[] dp = new int[n + 3];dp[0] = 0;dp[1] = 1;for (int i = 2; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}
  • 70. 爬楼梯
    public int climbStairs(int n) {if (n == 1 || n == 2) {return n;}/*** 遇到重叠子问题,采用动态规划* - dp数组含义:dp[i]表示有dp[i]种方法可以爬到楼顶(楼顶的台阶数为i)* - 初始化* - 状态转移和选择*/int[] dp = new int[n + 1];dp[1] = 1;dp[2] = 2;for (int i = 3; i <= n; i++) {dp[i] = dp[i - 1] + dp[i - 2];}return dp[n];}
  • 746. 使用最小花费爬楼梯
    public int minCostClimbingStairs(int[] cost) {/*** - 采用动态规划* - dp[i]:爬上i层使用的最少的花费*/int[] dp = new int[cost.length + 1];for (int i = 2; i <= cost.length; i++) {dp[i] = Math.min(dp[i - 1] + cost[i - 1], dp[i - 2] + cost[i - 2]);}return dp[cost.length];}
  • 62. 不同路径
    public int uniquePaths(int m, int n) {/*** - 每次都需要选择,采用动态规划* - dp[i][j]:到达(i,j)点的路径*/int[][] dp = new int[m][n];for (int i = 0; i < m; i++) {dp[i][0] = 1;}for (int j = 0; j < n; j++) {dp[0][j] = 1;}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];}
  • 63. 不同路径 II
    public int uniquePathsWithObstacles(int[][] obstacleGrid) {/*** 还是使用动态规划,只不过需要判断是否可达*/int m = obstacleGrid.length;int n = obstacleGrid[0].length;int[][] dp = new int[m][n];for (int i = 0; i < m; i++) {if (obstacleGrid[i][0] == 1) {break;}dp[i][0] = 1;}for (int j = 0; j < n; j++) {if (obstacleGrid[0][j] == 1) {break;}dp[0][j] = 1;}for (int i = 1; i < m; i++) {for (int j = 1; j < n; j++) {if (obstacleGrid[i][j] == 1) {continue;}dp[i][j] = dp[i - 1][j] + dp[i][j - 1];}}return dp[m - 1][n - 1];}
  • 343. 整数拆分
    public int integerBreak(int n) {if (n <= 3) {return n - 1;}/*** - 如何使用动态规划呢?* - 就需要从怎么拆入手* - 是否要拆,取决于拆完后结果和之前的结果谁更大*/int[] dp = new int[n + 1];dp[2] = 1;for (int i = 3; i <= n; i++) {for (int j = 1; j <= i - j; j++) {dp[i] = Math.max(dp[i], Math.max((i - j) * j, dp[i - j] * j));}}return dp[n];}public int integerBreak2(int n) {if (n <= 3) {return n - 1;}/*** - 这是纯数学解答* - 任何整数都可以拆成2和3* - 怎么拆,取决于模上3的余数是多少*/int remainder = n % 3;int times = n / 3;if (remainder == 0) {return (int) Math.pow(3, times);} else if (remainder == 1) {return (int) Math.pow(3, times - 1) * 4;} else {return (int) Math.pow(3, times) * 2;}}
  • 96. 不同的二叉搜索树(⭐⭐⭐⭐⭐)

这个题有点难,在于如何的合适区拆分成子问题:

应该先举几个例子,画画图,看看有没有什么规律,如图:

  • n = 1 , 2 时都很直观;
  • n = 3 时,分为:
    • 当1为头结点的时候,其右子树有两个节点,看这两个节点的布局,是不是和 n 为2的时候两棵树的布局是一样的啊!
    • 当2为头结点的时候,其左右子树都只有一个节点,布局是不是和n为1的时候只有一棵树的布局也是一样的啊!
    • 当3为头结点的时候,其左子树有两个节点,看这两个节点的布局,是不是和n为2的时候两棵树的布局也是一样的啊!
    • dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量;
      • dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2];
      • 元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量;
      • 元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量;
      • 元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量;
96.不同的二叉搜索树

96.不同的二叉搜索树2

    public int numTrees(int n) {/*** - 这个题有点难,在于如何正确的处理拆分子问题* - dp[i],代表i个节点组成的二叉搜索树的种数* - 拆分为 1.2.3.....i 为头节点组成的二叉搜索树的之和就是i个节点组成的二叉搜索树的种数*/int[] dp = new int[n + 1];dp[0] = 1;dp[1] = 1;for (int i = 2; i <= n; i++) {for (int j = 1; j <= i; j++) {dp[i] += dp[i - j] * dp[j - 1];}}return dp[n];}
  • 416. 分割等和子集(⭐⭐⭐)
    public boolean canPartition(int[] nums) {/*** - 可以将问题看成,是否能将数组中的元素凑出数组元素和的一半* - 背包容量为一半的数组和,物品价值和物品重量都是nums数组* - 采用一维数组的话,dp[i]代表数组容量为i时能背的最大价值*/int sum = 0;for (int i = 0; i < nums.length; i++) {sum += nums[i];}if (sum % 2 != 0) {return false;}sum /= 2;int[] dp = new int[sum + 1];for (int i = nums[0]; i <= sum; i++) {dp[i] = nums[0];}for (int i = 1; i < nums.length; i++) {for (int j = sum; j >= nums[i]; j--) {dp[j] = Math.max(dp[j], dp[j - nums[i]] + nums[i]);}}return dp[sum] == sum;}
  • 1049. 最后一块石头的重量 II
    public int lastStoneWeightII(int[] stones) {/*** - 也是背包问题*/int sum = 0;for (int i = 0; i < stones.length; i++) {sum += stones[i];}int target = sum / 2;int[] dp = new int[target + 1];for (int i = stones[0]; i <= target; i++) {dp[i] = stones[0];}for (int i = 1; i < stones.length; i++) {for (int j = target; j >= stones[i]; j--) {dp[j] = Math.max(dp[j], dp[j - stones[i]] + stones[i]);}}return sum - 2 * dp[target];}

总结

提示:这里对文章进行总结:

今天效率一般,心情有点emo,很害怕。

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

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

相关文章

Vue主面板组件模板(简洁版)

文章目录 &#x1f412;个人主页&#x1f3c5;JavaEE系列专栏&#x1f4d6;前言&#xff1a;&#x1f380;源码如下&#xff1a; &#x1f412;个人主页 &#x1f3c5;JavaEE系列专栏 &#x1f4d6;前言&#xff1a; 本篇博客主要以介绍【&#x1f380;主面板组件模板&#xf…

【计算机视觉|生成对抗】用深度卷积生成对抗网络进行无监督表示学习(DCGAN)

本系列博文为深度学习/计算机视觉论文笔记&#xff0c;转载请注明出处 标题&#xff1a;Unsupervised Representation Learning with Deep Convolutional Generative Adversarial Networks 链接&#xff1a;[1511.06434] Unsupervised Representation Learning with Deep Conv…

Webpack 的 sass-loader 在生产模式下最小化 CSS 问题

学习webpack时候我发现一个问题&#xff1a; 将mode 改为production模式后&#xff0c;生成的css会被压缩了&#xff0c;但是我并没有引入CssMinimizerPlugin插件&#xff0c;然后我试着将optimization.minimize 设置为false&#xff0c;测试是否为webpack自带的压缩&#xff0…

设备工单管理系统如何实现工单流程自动化?

设备工单管理系统属于工单系统的一种&#xff0c;基于其丰富的功能&#xff0c;它可以同时处理不同的多组流程&#xff0c;旨在有效处理发起人提交的事情&#xff0c;指派相应人员完成服务请求和记录全流程。该系统主要面向后勤管理、设备维护、物业管理、酒店民宿等服务行业设…

九、解析应用程序——分析应用程序(2)

文章目录 一、确定服务器端功能二、解析受攻击面 一、确定服务器端功能 通过留意应用程序向客户端披露的线索&#xff0c;通常可推断与服务器端功能和结构有关的大量信息&#xff0c;或者至少可做出有根据的猜测。以下面用于访问搜索功能的URL为例: 可见&#xff0c;.jsp文件扩…

选择最适合自己的笔记本

选择最适合自己的笔记本电脑 一、了解笔记本品牌一线品牌准一线品牌二线品牌三线品牌 二、笔记本入手渠道笔记本入手渠道 三、根据需求选择机型使用需求1.日常使用2.商务办公、财务3.轻度剪辑、ps4.代码5.创意设计6.游戏 四、笔记本电脑配置如何选1.cpu2.显卡&#xff08;GPU&a…

数据结构:力扣OJ题

目录 ​编辑题一&#xff1a;链表分割 思路一&#xff1a; 题二&#xff1a;相交链表 思路一&#xff1a; 题三&#xff1a;环形链表 思路一&#xff1a; 题四&#xff1a;链表的回文结构 思路一&#xff1a; 链表反转&#xff1a; 查找中间节点&#xff1a; 本人实力…

数字鸿沟,让气候脆弱者更脆弱

“从小到大完全没敢想&#xff0c;也觉得是不可思议的一件事儿&#xff0c;发洪水发到家门口了”&#xff0c;前两天&#xff0c;一位门头沟土著友人&#xff0c;给我发来了这句话。 气候变化正在影响整个地球&#xff0c;面对一连串前所未见的极端天气灾害&#xff0c;很多人应…

CCLINK IE FIELD BASIC转MODBUS-TCP网关cclink与以太网的区别

协议的不同&#xff0c;数据读取困难&#xff0c;这是很多生产管理系统的难题。但是现在&#xff0c;捷米JM-CCLKIE-TCP通讯网关&#xff0c;让这个问题变得非常简单。这款通讯网关可以将各种MODBUS-TCP设备接入到CCLINK IE FIELD BASIC网络中&#xff0c;连接到MODBUS-TCP总线…

运营商加速抢占云计算,5G带来更多利润,上半年躺赚近千亿

中国移动已率先公布了上半年的业绩&#xff0c;业绩显示它们正在加速抢占此前由互联网企业占据优势的云计算市场&#xff0c;不过最让它们开心的还是5G继续带动利润的高速增长&#xff0c;预计三大运营商今年上半年可以躺赚近千亿元。 中国移动无疑仍然是运营商行业的领头羊&am…

视觉学习(七)---Flask 框架下接口调用及python requests 实现json字符串传输

在项目实施过程中需要与其他系统进行接口联调&#xff0c;将图像检测的结果传递给其他系统接口&#xff0c;进行逻辑调用。这中间的过程可以通过requests库进行实现。 1.安装requests库 pip install requests2.postman 接口测试 我们先通过postman 了解下接口调用&#xff0…

论文笔记--Llama 2: Open Foundation and Fine-Tuned Chat Models

论文笔记--Llama 2: Open Foundation and Fine-Tuned Chat Models 1. 文章简介2. 文章概括3 文章重点技术3.1 预训练Pretraining3.1.1 预训练细节3.1.2 Llama2模型评估 3.2 微调Fine-tuning3.2.1 Supervised Fine-Tuning(FT)3.2.2 Reinforcement Learning with Human Feedback(…

树莓派RP2040 用Arduino IDE安装和编译

目录 1 Arduino IDE 1.1 IDE下载 1.2 安装 arduino mbed os rp2040 boards 2 编程-烧录固件 2.1 打开点灯示例程序 2.2 选择Raspberry Pi Pico开发板 2.3 编译程序 2.4 烧录程序 2.4.1 Raspberry Pi Pico开发板首次烧录提示失败 2.4.2 解决首次下载失败问题 2.4.2.1…

谈谈什么是云计算?以及它的应用

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 目录 ​编辑 一、什么是云计算 二、云计算的优势与劣势&#xff1f; 1、云计算的优势 ①提高资源利用率 ②提升效率 ③降低成本 2、云…

【100天精通python】Day32:使用python操作数据库_MySQL下载、安装、配置、使用实战

目录 专栏导读 1 MySQL概述 2 MySQL下载安装 2.1 下载 2.2 安装 2.3 配置 2.3.1 服务类型和网络配置&#xff1a; 2.3.2 连接配置&#xff1a; 2.3.3 账户和权限配置&#xff1a; 2.3.4 配置Windows Service &#xff1a; 2.3.5 服务器文件权限配置&#xff1a; 2.3…

单片机直驱两相四线步进电机研究

【本文发布于https://blog.csdn.net/Stack_/article/details/132236329&#xff0c;未经允许不得转载&#xff0c;转载须注明出处】 双极性步进电机&#xff08;两相四线步进电机&#xff09;&#xff0c;原理的东西就先不讲太多了&#xff0c;还没搞清楚&#xff0c;边查资料边…

VMware 16 Pro将电脑里的文件移动到虚拟机中【附带可能出现的问题和解决】

VMware 16 Pro将电脑里的文件移动到虚拟机中 1.使用VM tools 打开VM ware会出现下面的&#xff0c;直接点击安装。 点击下一步 选哪个都行 之后会重启虚拟机&#xff0c;然后就可以使用了。 我没有程序可以打开压缩包&#xff0c;显示我的虚拟机网络没法用&#xff0c;点击…

【软件工程】数据流图/DFD概念符号/流程图分层/数据字典

【软件工程】数据流图/DFD概念符号/流程图分层/数据字典 目录 【软件工程】数据流图/DFD概念符号/流程图分层/数据字典 一、数据流图 ( DFD ) 简介 二、数据流图 ( DFD ) 概念符号 1、数据流 2、加工 ( 核心 ) 3、数据存储 4、外部实体 三、数据流图 ( DFD ) 分层 1、…

【深度学习 | 反向传播】释放反向传播的力量: 让训练神经网络变得简单

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

阿里云服务器搭建WordPress建站教程基于Windows系统

本教程是使用阿里云服务器镜像系统选择的是Windows操作系统&#xff0c;手动安装WordPress博客网站全过程。本教程介绍如何在Windows操作系统的ECS实例上搭建WordPress网站。 目录 准备工作 搭建WordPress网站 解析WordPress网站域名 准备工作 创建Windows操作系统的ECS实…