二维动态规划题目(未完)

      

     1.最小路径和(力扣LCR 99题)

        给定一个包含非负整数的 m x n 网格 grid ,请找出一条从左上角到右下角的路径,使得路径上的数字总和为最小。

        说明:一个机器人每次只能向下或者向右移动一步。

        方法一:暴力递归

    //暴力递归public static int minPathSum(int[][] grid){return f1(grid,grid.length-1,grid[0].length-1);}public static int f1(int[][] grid,int i,int j){if(i==0 && j==0){return grid[0][0];}int up=Integer.MAX_VALUE;//从上边的格子移动过来的int left=Integer.MAX_VALUE;//从左边的格子移动过来的if(i-1>=0){//判断不越界up=f1(grid,i-1,j);}if(j-1>=0){//判断不越界left=f1(grid,i,j-1);}return grid[i][j]+Math.min(up,left);}

        暴力递归思路很清晰但是时间复杂度会非常高。提交也会超时。

        因为此暴力递归中,存在大量的重复计算,因此,时间复杂度比较差。

        方法二:记忆化递归

        带有记忆化的递归,也就是将每次的计算结果存入到一个结构中,每次发生重复计算时,直接从存数据的结构中取数据即可,由此可以减少大量的重复计算,时间复杂度有了较大的优化。

class Solution {public static int minPathSum(int[][] grid){int n=grid.length;int m=grid[0].length;int[][] dp=new int[n][m];for(int i=0;i<n;i++){for(int j=0;j<m;j++){dp[i][j]=-1;}}return f2(grid,grid.length-1,grid[0].length-1,dp);}public static int f2(int[][] grid, int i, int j, int[][] dp) {if(dp[i][j]!=-1){return dp[i][j];}int ans;if(i==0 && j==0){ans=grid[0][0];}else {int up=Integer.MAX_VALUE;//从上边的格子移动过来的int left=Integer.MAX_VALUE;//从左边的格子移动过来的if(i-1>=0){//判断不越界up=f2(grid,i-1,j,dp);}if(j-1>=0){//判断不越界left=f2(grid,i,j-1,dp);}ans=grid[i][j]+Math.min(up,left);}dp[i][j]=ans;return ans;}
}

        方法三:根据依赖关系推出

        每一个位置,只能从上或者左得到,只依赖上和左。

class Solution {//非递归,按照依赖关系求解public static int minPathSum(int[][] grid){int n=grid.length;int m=grid[0].length;int[][] dp=new int[n][m];dp[0][0]=grid[0][0];for(int i=1;i<n;i++){dp[i][0]=dp[i-1][0]+grid[i][0];}for(int j=1;j<m;j++){dp[0][j]=dp[0][j-1]+grid[0][j];}for(int i=1;i<n;i++){for(int j=1;j<m;j++){dp[i][j]=Math.min(dp[i-1][j],dp[i][j-1])+grid[i][j];}}return dp[n-1][m-1];}
}

        方法四:依赖关系+空间压缩

        我们有时候没有必要,为了求二维数组中的某一个值而弄一个二维数组,如果压缩为一维数组,也能够解决问题的话,那么我们应该尽量采用一维数组的形式。

        我们用一维数组来表示第i行的结果,直到推到最后一行。

class Solution {//位置依赖+空间压缩public static int minPathSum(int[][] grid){int n=grid.length;int m=grid[0].length;int[] dp=new int[m];dp[0]=grid[0][0];for(int j=1;j<m;j++){dp[j]=dp[j-1]+grid[0][j];}for(int i=1;i<n;i++){dp[0]+=grid[i][0];for(int j=1;j<m;j++){dp[j]=Math.min(dp[j-1],dp[j])+grid[i][j];}}return dp[m-1];}
}

2.单词搜索(力扣79题)

        给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。

        单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母不允许被重复使用。

        暴力递归搜索

        首先遍历二维数组,看当前字符是否是要查找单词的首字母,如果是,调用递归,否则跳过。

        然后就是递归过程,每次递归,都要向四个方向去搜索剩余字母,分别判断符合条件并调用相应的递归函数。

class Solution {public boolean exist(char[][] board, String word) {char[] charArray = word.toCharArray();boolean[][] flag=new boolean[board.length][board[0].length];for(int i=0;i<board.length;i++){for(int j=0;j<board[0].length;j++){if(board[i][j]==charArray[0]){flag[i][j]=true;if(f1(board,charArray,i,j,flag,0)){return true;}flag[i][j]=false;}}}return false;}public boolean f1(char[][] board,char[] charArray,int i,int j,boolean[][] flag,int index){index++;if(index>=charArray.length){return true;}boolean isFait=false;if(i-1>=0 && !flag[i-1][j] && charArray[index]==board[i-1][j]){flag[i-1][j]=true;isFait=f1(board,charArray,i-1,j,flag,index) || isFait;flag[i-1][j]=false;}if(i+1<board.length && !flag[i+1][j] && charArray[index]==board[i+1][j]){flag[i+1][j]=true;isFait=f1(board,charArray,i+1,j,flag,index) || isFait;flag[i+1][j]=false;}if(j-1>=0 && !flag[i][j-1] && charArray[index]==board[i][j-1]){flag[i][j-1]=true;isFait=f1(board,charArray,i,j-1,flag,index) || isFait;flag[i][j-1]=false;}if(j+1<board[0].length && !flag[i][j+1] && charArray[index]==board[i][j+1]){flag[i][j+1]=true;isFait=f1(board,charArray,i,j+1,flag,index) || isFait;flag[i][j+1]=false;}return isFait;}
}

        3.最长公共子序列(力扣LCR 95题)

        给定两个字符串 text1 和 text2,返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 ,返回 0 。

        一个字符串的 子序列 是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。

  • 例如,"ace" 是 "abcde" 的子序列,但 "aec" 不是 "abcde" 的子序列。

        两个字符串的 公共子序列 是这两个字符串所共同拥有的子序列。

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

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

相关文章

软考46-上午题-【数据库】-数据查询语言DQL1

一、SQL数据查询功能 SELECT语句的语法如下&#xff1a; 【注意】&#xff1a; 使用DISTINCT选项可以去重&#xff1b; form子句中出现多个基本表或视图时&#xff0c;系统首先执行笛卡尔积操作。 下面的查询示例均以这些表为基础 1-1、投影查询-SELECT 【回顾】&#xff1a;…

自定义神经网络三之梯度和损失函数激活函数

文章目录 前言梯度概述梯度下降算法梯度下降的过程 optimize优化器 梯度问题梯度消失梯度爆炸 损失函数常用的损失函数损失函数使用原则 激活函数激活函数和损失函数的区别激活函数Relu-隐藏层激活函数Sigmoid和Tanh-隐藏层Sigmoid函数Tanh&#xff08;双曲正切&#xff09; &l…

基于Pytorch的猫狗图片分类【深度学习CNN】

猫狗分类来源于Kaggle上的一个入门竞赛——Dogs vs Cats。为了加深对CNN的理解&#xff0c;基于Pytorch复现了LeNet,AlexNet,ResNet等经典CNN模型&#xff0c;源代码放在GitHub上&#xff0c;地址传送点击此处。项目大纲如下&#xff1a; 文章目录 一、问题描述二、数据集处理…

单片机一个32位地址对应多大的存储空间?

文章目录 文字图片 文字 一个地址是4个字节 一个地址对应一个字节的存储空间&#xff08;无论8位、16位、32位单片机&#xff09; 学过C语言的都知道&#xff1a;指针就是地址&#xff0c;因此指针也是4个字节 图片 这两张是工作的笔记、主要看第二张&#xff0c;左边是代码&…

第7.1章:StarRocks性能调优——查询分析

目录 一、查看查询计划 1.1 概述 1.2 查询计划树 1.3 查看查询计划的命令 1.3 查看查询计划 二、查看查询Profile 2.1 启用 Query Profile 2.2 获取 Query Profile 2.3 Query Profile结构与详细指标 2.3.1 Query Profile的结构 2.3.2 Query Profile的合并策略 2.…

单链表详解

个人主页&#xff1a;不爱学英文的码字机器-CSDN博客 收录合集&#xff1a;《数据结构》 在本篇博客中&#xff0c;我们将深入探讨单链表的定义、实现和应用。 本篇博客将用C语言实现的单链表进行讲解&#xff0c;通过一段代码一段讲解来逐个详细讲解&#xff0c;深入了解单链表…

Java编程与数据库技术:疫情居家办公的坚实后盾

✍✍计算机毕业编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java、…

基于自适应波束成形算法的matlab性能仿真,对比SG和RLS两种方法

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.本算法原理 5.完整程序 1.程序功能描述 基于自适应波束成形算法的matlab性能仿真,对比SG和RLS两种方法. 2.测试软件版本以及运行结果展示 MATLAB2022a版本运行 3.核心程序 ........................…

字符函数和字符串函数(C语言进阶)(三)

目录 前言 接上篇&#xff1a; 1.7 strtok 1.8 strerror 1.9 字符分类函数 总结 前言 C语言中对字符和字符串的处理是很频繁的&#xff0c;但是c语言本身是没有字符串类型的&#xff0c;字符串通常放在常量字符串中或着字符数组中。 字符串常量适用于那些对它不做修改的字…

某电力铁塔安全监测预警系统案例分享

项目概述 电力铁塔是承载电力供应的重要设施&#xff0c;它的安全性需要得到可靠的保障。但是铁塔一般安装在户外&#xff0c;分布广泛&#xff0c;且有很多安装在偏远地区&#xff0c;容易受到自然、人力的影响和破环。因此需要使用辅助的方法实时监控铁塔的安全状态&#xff…

使用GPT生成python图表

首先&#xff0c;生成一脚本&#xff0c;读取到所需的excel表格 import xlrddata xlrd.open_workbook(xxxx.xls) # 打开xls文件 table data.sheet_by_index(0) # 通过索引获取表格# 初始化奖项字典 awards_dict {"一等奖": 0,"二等奖": 0,"三等…

HarmonyOS—代码Code Linter检查

Code Linter代码检查 Code-Linter针对ArkTS/TS代码进行最佳实践、编程规范方面的检查&#xff0c;目前还会检查ArkTS语法规则。开发者可根据扫描结果中告警提示手工修复代码缺陷&#xff0c;或者执行一键式自动修复&#xff0c;在代码开发阶段&#xff0c;确保代码质量。 检查…