算法训练营Day35

#Java #动态规划

开源学习资料

Feeling and experiences:

不同路径:力扣题目链接

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish” )。

问总共有多少条不同的路径?

该题我们直接分析:到达Finish之前,我们的位置可以在哪里?

达到Finish之前,我们位置可以在它上面,也可以在它左边。

所以,到达Finish的路径 就等于,到达Finish上面的路径数加到达Finish左边的路径数。

class Solution {public int uniquePaths(int m, int n) {//题目规定机器人每次只能向下或者向右移动一步//所以,要到到达finish,要么从上面往下走一格,要么从左往右走一格//创建dp数组int [][]dp = new int[m][n];//初始化 (把一行一列初始化为1)for(int i =0;i<m;i++){dp[i][0] = 1;}for(int i=0;i<n;i++){dp[0][i] = 1;}//递推公式//  dp[i][j] = dp[i-1][j] + dp[i][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]; }
}

代码很直观,主要注意的就是对dp数组的初始化。

我们把第一行和第一列都初始化为 1 ;

整体思路:

1.创建一个二维dp数组,其含义:到达 i 行 j 列,有dp[i][j]条路径;

2.根据递推,到达 i 行 j 列的路径数也等于 到达i-1行 j 列的路径书 加上 达到i行 j-1列的路径数目;

3.初始化第一行和第一列,因为这种情况下,它们都只有一种路径数;

不同路径 II:力扣题目链接

一个机器人位于一个 m x n 网格的左上角 (起始点在下图中标记为 “Start” )。

机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角(在下图中标记为 “Finish”)。

现在考虑网格中有障碍物。那么从左上角到右下角将会有多少条不同的路径?

网格中的障碍物和空位置分别用 10 来表示。

 该题,多了障碍物

因为题目说的很明白,在题目给的二维数组obstacleGrid中,1 代表障碍物,0代表空位置。

那么显然,这道题的关键还是初始化和递推,我们首先更改初始化;

因为递推也是根据第一行与第一列来的,初始化位置也可能出现有障碍物;

 for(int i = 0;i<hang && obstacleGrid[i][0] == 0;i++){

        dp[i][0] = 1;

    }

    for(int i = 0;i<lie && obstacleGrid[0][i] == 0;i++){

        dp[0][i] = 1;

    }

class Solution {public int uniquePathsWithObstacles(int[][] obstacleGrid) {int hang = obstacleGrid.length;int lie = obstacleGrid[0].length;//创建dp数组int [][]dp = new int[hang][lie];//初始化://障碍物在出发点,或者在终点的情况,则直接返回0if(obstacleGrid[0][0] == 1 || obstacleGrid[hang-1][lie-1] == 1){return 0;}//初始化第一行,第一列for(int i = 0;i<hang && obstacleGrid[i][0] == 0;i++){dp[i][0] = 1;}for(int i = 0;i<lie && obstacleGrid[0][i] == 0;i++){dp[0][i] = 1;}//循环,递推for(int i =1;i<hang;i++){for(int j=1;j<lie;j++){dp[i][j] = (obstacleGrid[i][j] == 0) ? dp[i - 1][j] + dp[i][j - 1] : 0;}}return dp[hang-1][lie-1];}
}

主要修改的就是初始化dp数组,递推公式原理都是一样的;

整数拆分:力扣题目链接

给定一个正整数 n ,将其拆分为 k正整数 的和( k >= 2 ),并使这些整数的乘积最大化。

返回 你可以获得的最大乘积 。

示例 1:

输入: n = 2
输出: 1
解释: 2 = 1 + 1, 1 × 1 = 1。

该题的递推公式不好想

结合力扣官解和代码随想录:

将 i 拆分成 j 和 i-j 的和,i 和 j不再拆成多个正整数,则乘积为:i *(i-j);

将 i 拆分成 j 和 i-j的和,但是i-j 还要再拆分,则乘积为:i*dp[i-j];

由此我们可以得到递推公式:

dp[i] = Math.max(dp[i], Math.max(j*(i-j), j*dp[i-j]));

代码如下:

class Solution {public int integerBreak(int n) {//创建dp数组,其含义为:正整数为 i ,得到的乘积最大化为dp[i];int []dp = new int [n+1];//初始化dp[2] = 1;//递推公式:// dp[i] = Math.max(dp[i], Math.max(j*(i-j), j*dp[i-j]));//循环,递推for(int i =3;i<=n;i++){for(int j =1;j<=i-j;j++){dp[i] = Math.max(dp[i], Math.max(j*(i-j), j*dp[i-j]));}}return dp[n];
}
}

主要就是递推公式!

不同的二叉搜索树:力扣题目链接

给你一个整数 n ,求恰由 n 个节点组成且节点值从 1n 互不相同的 二叉搜索树 有多少种?返回满足题意的二叉搜索树的种数。

示例 1:

输入:n = 3
输出:5

第一眼结合本章提醒,猜出来要找规律

参考代码随想录:

dp 数组含义,dp[i] : 1到i为节点组成的二叉搜索树的个数为dp[i]

dp[3],就是 元素1为头结点搜索树的数量 + 元素2为头结点搜索树的数量 + 元素3为头结点搜索树的数量

元素1为头结点搜索树的数量 = 右子树有2个元素的搜索树数量 * 左子树有0个元素的搜索树数量

元素2为头结点搜索树的数量 = 右子树有1个元素的搜索树数量 * 左子树有1个元素的搜索树数量

元素3为头结点搜索树的数量 = 右子树有0个元素的搜索树数量 * 左子树有2个元素的搜索树数量

有2个元素的搜索树数量就是dp[2]。

有1个元素的搜索树数量就是dp[1]。

有0个元素的搜索树数量就是dp[0]。

所以dp[3] = dp[2] * dp[0] + dp[1] * dp[1] + dp[0] * dp[2]

综上可得递推公式:

 dp[i] += dp[j - 1] * dp[i - j];

 

代码如下:

class Solution {public int numTrees(int n) {//创建dp数组int []dp = new int[n+1];//初始化dp数组dp[0] = 1;dp[1] = 1;//递推公式://dp[i] += dp[j - 1] * dp[i - j]; for(int i = 2;i<=n;i++){for(int j =1;j<=i;j++){dp[i] += dp[j - 1] * dp[i - j];}}return dp[n];}
}

画图找出规律就很好解了~

功名半纸,

风雪千山......

Fighting!

 

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

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

相关文章

MyBatisPlus学习三:Service接口、代码生成器

学习教程 黑马程序员最新MybatisPlus全套视频教程&#xff0c;4小时快速精通mybatis-plus框架 Service接口 简介 在MyBatis-Plus框架中&#xff0c;Service接口的作用是为实体类提供一系列的通用CRUD&#xff08;增删改查&#xff09;操作方法。通常情况下&#xff0c;Servi…

PyTorch 入门学习数据操作之创建

简介 在深度学习中&#xff0c;我们通常会频繁地对数据进行操作&#xff1b;要操作一般就需要先创建。 官方介绍 The torch package contains data structures for multi-dimensional tensors and defines mathematical operations over these tensors. Additionally, it pr…

k8s-二进制部署

ETCD master节点 制作证书 1、下载证书工具 [rootmaster ~]# wget https://pkg.cfssl.org/R1.2/cfssl_linux-amd64 --no-check-certificate [rootmaster ~]# wget https://pkg.cfssl.org/R1.2/cfssljson_linux-amd64 --no-check-certificate [rootmaster ~]# wget https://…

SpringMVC通用后台管理系统源码

整体的SSM后台管理框架功能已经初具雏形&#xff0c;前端界面风格采用了结构简单、 性能优良、页面美观大的Layui页面展示框架 数据库支持了SQLserver,只需修改配置文件即可实现数据库之间的转换。 系统工具中加入了定时任务管理和cron生成器&#xff0c;轻松实现系统调度问…

【源码解析】Apache RocketMQ发送消息源码

send message源码解析 引入 send message方法作为我们经常使用的方法&#xff0c;平时我们很难去关注他底层到底做了什么。大部分人只知道通过send message方法可以将消息发送到broker&#xff0c;然后供消费者进行消费。其实不然&#xff0c;消息从客户端发送到broker&#x…

ssm基于vue.js的购物商场的设计与实现论文

摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装购物商场软件来发挥其高效地信息处理的作用&#xff0c;可以…

Spring Cloud Bus 相关问题及答案(2024)

1、什么是 Spring Cloud Bus&#xff1f; Spring Cloud Bus 是建立在 Spring Cloud 的基础之上&#xff0c;用于处理微服务架构中各服务实例间消息通信的框架。它与 Spring Cloud Config 结合使用时&#xff0c;可以提供一种动态刷新配置的能力&#xff0c;不需要重启服务实例…

阿里云服务器配置选择推荐方案

阿里云服务器配置怎么选择合适&#xff1f;CPU内存、公网带宽和ECS实例规格怎么选择合适&#xff1f;阿里云服务器网aliyunfuwuqi.com建议根据实际使用场景选择&#xff0c;例如企业网站后台、自建数据库、企业OA、ERP等办公系统、线下IDC直接映射、高性能计算和大游戏并发&…

cissp 第10章 : 物理安全要求

10.1 站点与设施设计的安全原则 物理控制是安全防护的第一条防线&#xff0c;而人员是最后一道防线。 10.1.1 安全设施计划 安全设施计划通过关键路径分析完成。 关键路径分析用于找出关键应用、流程、运营以及所有必要支撑元索间的关系。 技术融合指的是各种技术、解决方案…

性能优化-OpenMP基础教程(三)

本文主要介绍OpenMP并行编程的环境变量和实战、主要对比理解嵌套并行的效果。 &#x1f3ac;个人简介&#xff1a;一个全栈工程师的升级之路&#xff01; &#x1f4cb;个人专栏&#xff1a;高性能&#xff08;HPC&#xff09;开发基础教程 &#x1f380;CSDN主页 发狂的小花 &…

书生·浦语大模型全链路开源体系 学习笔记 第一课

背景 大模型是发展人工通用人工智能的一个重要途径&#xff0c;能够解决多种任务和多种模态&#xff0c;展示了一个更面向更高阶的智能的潜在途径。大模型的发展历程是从专用模型到通用模型的过程&#xff0c;从语音识别、图像识别、人脸识别等专用模型&#xff0c;到通用的大…

Java8内置四大核心函数式接口

先来看几个例子,主要练习策略模式: 用策略模式的做法 定义个接口 其实像这样的接口并不需要我们自己创建 java8推出的Lambda表达式主要就是为了简化开发,而Lambda表达式 的应用主要是针对与函数式接口,自然也推出了对应的一些接口 /*** Java8 内置的四大核心函数式接口** C…

找城市(100%用例)C卷 (JavaPythonC++Node.jsswift)

一张地图上有n个城市,城市和城市之间有且只有一条道路相连:要么直接相连,要么通过其它城市中转相连(可中转一次或多次)。城市与城市之间的道路 都不会成环 。 当切断通往某个城市 i 的所有道路后,地图上将分为多个连通的城市群,设该城市 i 的聚集度为 DP i (Degree of…

7-2 jmu-java-m02-使用二维数组存储多元线性方程组 --笔记篇

题目 题面 可以使用二维数组存储来存储线性方程组的系数与常数。比如&#xff0c;对于如下3元线性方程组 3xyz1 6x2yz-1 -2x2yz7 可以使用二位数组存储 2 1 1 1 6 2 1 -1 -2 2 1 7 编写一个程序可以存储n元线性方程组 输入格式: 整数n&#xff0c;代表n元 n行、每行n1列线性方…

【C++】STL 算法 ③ ( 函数对象中存储状态 | 函数对象作为参数传递时值传递问题 | for_each 算法的 函数对象 参数是值传递 )

文章目录 一、函数对象中存储状态1、函数对象中存储状态简介2、示例分析 二、函数对象作为参数传递时值传递问题1、for_each 算法的 函数对象 参数是值传递2、代码示例 - for_each 函数的 函数对象 参数在外部不保留状态3、代码示例 - for_each 函数的 函数对象 返回值 一、函数…

权威认可!甄知科技猪齿鱼产品荣获信创产品评估证书

近日&#xff0c;依据《信息技术应用创新产品评估规范 第1部分&#xff1a;应用软件》&#xff08;T/SSIA 2001-2022&#xff09;&#xff0c;经过严格评估&#xff0c;甄知科技旗下自主研发的猪齿鱼数智化开发管理平台 V2.0.0&#xff0c;通过信创测试认证&#xff0c;获得上海…

差分约束算法

差分约束 差分约束系统包含 m m m个涉及 n n n个变量的差额限制条件&#xff0c;这些差额限制条件每个都是形式为 x i − x j ≤ b ∈ [ 1 , m ] x_i-x_j\leq b_{\in[1,m]} xi​−xj​≤b∈[1,m]​的简单线性不等式。 通常我们要求解出一组可行解。 最短路差分约束 如果我们…

12.15 log 122.买卖股票的最佳时机 II,55. 跳跃游戏

122.买卖股票的最佳时机 II class Solution { public:int maxProfit(vector<int>& prices) {int result0;for(int i0;i<prices.size();i){if(i>0&&prices[i]-prices[i-1]>0){resultprices[i]-prices[i-1];}}return result;} }; 这道题贪心贪的时每…

ubuntu 22 virt-manger(kvm)安装winxp; ubuntu22体验 firebird3.0

安装 、启动 virt-manager sudo apt install virt-manager sudo systemctl start libvirtdsudo virt-manager安装windowsXP 安装过程截图如下 要点1 启用 “包括寿终正寝的操作系统” win_xp.iso 安装过程 &#xff1a; 从winXp.iso启动, 执行完自己重启从硬盘重启&#xff0c…

稿件代写3个不可或缺的步骤让你事半功倍-华媒舍

作为一个需求频繁的作者&#xff0c;你可能会面临大量的稿件代写任务。但是&#xff0c;你是否曾经为提高文章质量而苦恼过&#xff1f;是否希望在有限的时间内完成更多的代写任务&#xff1f;本篇文章将向你介绍三个不可或缺的稿件代写步骤&#xff0c;帮助你事半功倍&#xf…