【算法训练记录——Day39】

Day39——动态规划Ⅱ

  • 1.leetcode_62不同路径
  • 2.leetcode_63不同路径Ⅱ
  • 3.leetcode_343整数拆分
  • 4.leetcode_96不同的二叉树搜索

1.leetcode_62不同路径

在这里插入图片描述
思路:经典的动态规划问题:

  1. dp[i][j]表示到达(i,j)位置时的不同路径数
  2. 因为只能向下或向右走,因此当前位置只能从上面或左边过来,dp[i][j] = dp[i-1][j] + dp[i][j-1]
  3. 初始化:最左边只能从头顶过来,最上面只能从右侧过来。即:dp[i][0] = 1; dp[0][j] = 1;
  4. 顺序是从左上角到右下角
  5. dp[i][j] = dp[i-1][j] + dp[i][j-1](i != 0 && j != 0)
	int uniquePaths(int m, int n) {vector<vector<int>> dp(m, vector<int>(n, 0));for(int i = 0; i < m; i++) for(int j = 0; j < n; j++) {if(i == 0 || j == 0)dp[i][j] = 1;else dp[i][j] = dp[i-1][j] + dp[i][j-1];}return dp[m-1][n-1];}

方法二:滚动数组,没太理解,二刷再看

	int uniquePaths(int m, int n) {vector<int> dp(n);for (int i = 0; i < n; i++) dp[i] = 1;for (int j = 1; j < m; j++) {for (int i = 1; i < n; i++) {dp[i] += dp[i - 1];}}return dp[n - 1];}

2.leetcode_63不同路径Ⅱ

在这里插入图片描述
思路:和上一题区别在于存在障碍物,那么若存在障碍物,dp[i][j] 置为0
还有初始化上的区别:上一题直接 i == 0 || j == 0时,置为1,这次需要判断当前位置及当前位置以前有没有障碍,有的话就是0了,所以把初始化这部分单独拿出来。

	int uniquePathsWithObstacles(vector<vector<int>>& obstacleGrid) {int m = obstacleGrid.size();int n = obstacleGrid[0].size();if (obstacleGrid[m - 1][n - 1] == 1 || obstacleGrid[0][0] == 1) //如果在起点或终点出现了障碍,直接返回0return 0;vector<vector<int>> dp(m, vector<int>(n, 0));dp[0][0] = !obstacleGrid[0][0];for(int i = 1; i < n; i++)dp[0][i] = dp[0][i-1] & !obstacleGrid[0][i];for(int j = 1; j < m; j++)dp[j][0] = dp[j-1][0] & !obstacleGrid[j][0];for(int i = 1; i < m; i++) for(int j = 1; j < n; j++) {if(obstacleGrid[i][j] == 1) {dp[i][j] = 0; } else dp[i][j] = dp[i-1][j] + dp[i][j-1];}// for(int i = 0; i < m; i++) {//     for(int j = 0; j < n; j++) {//         cout << dp[i][j] << " ";//     }//     cout << endl;// }return dp[m-1][n-1];}

看了一下题解,总体思路差不多,但是比我的能简洁一点,贴出部分代码:

  1. 在初始化dp时,我的做法是全部赋值了,但这里进行了判断,减少了不必要的赋值操作
	for (int i = 0; i < m && obstacleGrid[i][0] == 0; i++) dp[i][0] = 1;for (int j = 0; j < n && obstacleGrid[0][j] == 0; j++) dp[0][j] = 1;
  1. 在循环处理dp数组时,如果当前存在障碍,我又双叒做了无效赋值操作,直接跳过就好了
	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];}
}

3.leetcode_343整数拆分

在这里插入图片描述
思路:
a(c-a) = -a² + ac, 在 a = -c(2*-1) 最大,a = c/2;
同理如果是三个 a + b + c = C; a (C-(c+a))(C-(a+b)),好好好不会了
动态规划上场,所犯不明白为啥要用动态规划

  1. dp[i]:分拆数字i,可以得到的最大乘积为dp[i]。

  2. i可以拆成 i-1 + 1 或者 i - 2 + 2, …i-i/2 + i/2;求这个的最大值,即 f[i] = max(f(i-1)*f(1), f(i-2)*f(2), … , f(i-i/2)*f(i/2)); 这感觉和没有差不多。。。模拟了一下发现还少了一种情况,即当前元素 i > dp[i],这时应该用当前元素和dp[i]的最大值。f[i] = max(max(f(i-1), i-1)*f(1),

  3. 初始化dp数组, dp[1] = 1; dp[2] = 1;

  4. 从1~n;

  5. 有点推不出来了,看下题解吧

  6. i可以拆分为两个或者多个,如果是两个那么 dp[i] = max({j, i-j}); 如果是多个,那么 dp[i] = max({j, dp[i-j]}), 使用dp[i] 保存前一次比较结果,即 dp[i] = max(dp[i], j*(i-j), j*dp[i-j]);

    int integerBreak(int n) {vector<int> dp(n+1);dp[2] = 1;for(int i = 3; i <= n; i++) {for(int j = 1; j <= i >> 1; j++) {dp[i] = max(dp[i], max(j * (i-j), j * dp[i-j]));	}	}return dp[n];}

4.leetcode_96不同的二叉树搜索

在这里插入图片描述
思路:不会,举例找规律
n = 1 ,1个 0
n = 2, 2个 4
n = 3 5 8
n = 4 14 16
n = 5 42 32
n = 6 132 64
n = 7 429 128

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

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

相关文章

运维锅总浅析云原生DevOps工具

本文从Tekton与Kubevela、Jenkins、GitLab CI的区别与联系对常见的云原生DevOps工具进行对比分析&#xff0c;最后给出DevOps工具选型思路。希望对您有所帮助&#xff01; 一、DevOps简介 DevOps是一种结合了软件开发&#xff08;Development&#xff09;和IT运维&#xff08…

怎么在windows、linux、mac上安装pnpm呢?

怎么在windows、linux、mac上安装pnpm呢&#xff1f; 前言 如果您不使用独立脚本或 pnpm/exe 来安装 pnpm&#xff0c;则需要在系统上安装 Node.js&#xff08;至少 v16.14&#xff09;。 原址&#xff1a;https://pnpm.io/zh/installation 使用独立脚本安装 即使没有安装…

登录功能和校验

基础版 controller package com.web.management.controller;import com.web.management.pojo.Emp; import com.web.management.pojo.Result; import com.web.management.service.EmpService; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.anno…

Ignis 应用: 社交 + 游戏 + 工业4.0,Ignis 构建Web3生态圈

引言 在数字经济快速发展的今天&#xff0c;Web3技术为我们带来了前所未有的变革。作为Ardor平台的主要子链&#xff0c;Ignis公链在推动Web3生态系统建设中扮演了重要角色。本文将通过介绍Vessel Chain、Mythical Beings和Bridge Champ等应用&#xff0c;探讨Ignis公链如何通…

GB/T 43566-2023中小学人造草面层足球场地检测

人造草面层是指以类似天然草的合成纤维经机械编织固定于底布上形成人造草&#xff0c;至现场粘接并与弹性垫层等必要的其他材料组装成整体的面层。 GB/T 43566-2023中小学人造草面层足球场地检测项目&#xff1a; 测试项目 测试方法 人造草物理性能 GB/T 20394 人造草有害…

html+css+js文章模板

图片 源代码在图片后面&#xff0c;点赞加关注&#xff0c;谢谢&#x1f604; 源代码 <!DOCTYPE html> <html lang"zh"> <head> <meta charset"UTF-8"> <meta name"viewport" content"widthdevice-width,…

redis的数据类型对应的使用场景

Redis提供了多种数据类型&#xff0c;每种数据类型都有其特定的适用场景。以下是Redis主要数据类型及其典型应用场景&#xff1a;1. 字符串(String) 应用场景&#xff1a;适用于存储简单的键值对数据&#xff0c;如用户基本信息、计数器&#xff08;如网页访问次数&…

停车场车牌识别计费系统,用Python如何实现?

关注星标&#xff0c;每天学习Python新技能 前段时间练习过的一个小项目&#xff0c;今天再看看&#xff0c;记录一下~ 项目结构 说明&#xff1a; datefile文件夹&#xff1a;保存车辆信息表的xlsx文件 file文件夹&#xff1a;保存图片文件夹。ic_launcher.jpg是窗体的右上角…

周下载量20万的npm包---store

https://www.npmjs.com/package/store <script setup> import { onMounted } from vue import store from storeonMounted(() > {store.set(user, { name: xutongbao })let user store.get(user)console.log(user) //对象console.log(localStorage.getItem(user)) //…

基于深度学习的换头特效

基于深度学习的换头特效是一项计算机视觉和图像处理技术&#xff0c;旨在将一个人的脸部特征无缝替换到另一个人的头部&#xff0c;同时保持自然和真实的视觉效果。这项技术广泛应用于电影制作、虚拟现实、娱乐和社交媒体等领域。以下是关于这一领域的系统介绍&#xff1a; 1.…

linux nfs的使用

版权声明&#xff1a;来自百度AI&#xff0c;此处记录是方便日后查看&#xff0c;无任何商业用途 linux网络文件共享服务之nfs NFS&#xff08;Network File System&#xff09;是一种允许计算机用户或者操作系统通过网络以类似本地的方式访问文件的协议。以下是一个简单的NF…

CesiumJS【Basic】- #056 绘制纹理填充多边形(Entity方式)-使用shader

文章目录 绘制纹理填充多边形(Entity方式)-使用shader1 目标2 代码2.1 main.ts绘制纹理填充多边形(Entity方式)-使用shader 1 目标 使用Entity方式绘制绘制纹理填充多边形 - 使用shader 2 代码 2.1 main.ts import * as Cesium from cesium;const viewer = new Cesium…

搭建个人博客及错误记录

搭建个人博客及错误记录 文章目录 搭建个人博客及错误记录需要用到的网址2.推荐两个参考教学视频3.发布一篇博客个人主题配置的提醒localhost拒绝连接问题解决办法ssh -T gitgithub.com失败问题解决Deployer not found:git解决 可以根据目录解决遇到的相同问题 需要用到的网址 …

朋友圈运营必备!一键转发和自动转发轻松搞定!

你还在手动发布多个微信号的朋友圈吗&#xff1f; 现在&#xff0c;就教你一招&#xff0c;让你轻松实现一键转发和自动转发朋友圈&#xff01; 首先&#xff0c;我们需要在个微管理系统上登录自己的微信号&#xff0c;以便进行统一管理。这个系统可以多个微信号同时登录&…

项目经验-不同行业、不同风格的网站设计

网站UI设计的首要考虑点是布局与导航。合理的布局能够确保信息清晰呈现&#xff0c;使用户能够快速定位所需内容。同时&#xff0c;简洁明了的导航设计能够引导用户流畅浏览&#xff0c;减少迷失感。通过精心设计的布局和导航&#xff0c;可以提升用户体验&#xff0c;增强用户…

Pointnet++改进即插即用系列:全网首发GLSA聚合和表示全局和局部空间特征|即插即用,提升特征提取模块性能

简介:1.该教程提供大量的首发改进的方式,降低上手难度,多种结构改进,助力寻找创新点!2.本篇文章对Pointnet++特征提取模块进行改进,加入GLSA,提升性能。3.专栏持续更新,紧随最新的研究内容。 目录 1.理论介绍 2.修改步骤 2.1 步骤一 2.2 步骤二 2.3 步骤三 1.理论介…

深入剖析Tomcat(十五、十六) 关闭钩子,保证Tomcat的正常关闭

《深入剖析Tomcat》书中第十五章讲解了如何通过配置XML的方式来配置Tomcat的各个组件&#xff0c;并通过Digester库来解析XML。我们常操作的xml文件应该就是 server.xml这个文件&#xff0c;当在一台机器上部署多个Tomcat时&#xff0c;就必须修改连接器和 [“关闭Tomcat”程序…

网格搜索(Grid Search)及其Python和MATLAB实现

**背景&#xff1a;** 网格搜索&#xff08;Grid Search&#xff09;是一种常见的参数优化方法&#xff0c;用于在给定的参数范围内搜索最优的参数组合&#xff0c;以优化模型的性能。该方法通过穷举搜索参数空间中的所有可能组合&#xff0c;寻找最佳参数配置&#xff0c;是调…

Spring源码九:BeanFactoryPostProcessor

上一篇Spring源码八&#xff1a;容器扩展一&#xff0c;我们看到ApplicationContext容器通过refresh方法中的prepareBeanFactory方法对BeanFactory扩展的一些功能点&#xff0c;包括对SPEL语句的支持、添加属性编辑器的注册器扩展解决Bean属性只能定义基础变量的问题、以及一些…

Netty 粘包/拆包、解码工具类

1. 概述 1.1 粘包 发送 abc def&#xff0c;接收 abcdef 原因 滑动窗口&#xff1a;假设发送方 256 bytes 表示一个完整报文&#xff0c;但由于接收方处理不及时且窗口大小足够大&#xff0c;这 256 bytes 字节就会缓冲在接收方的滑动窗口中&#xff0c;当滑动窗口中缓冲了…