力扣周赛314-矩阵中和能被 K 整除的路径(动态规划)

news/2024/5/20 4:45:30/文章来源:https://blog.csdn.net/sigd/article/details/127341681

         解题思路:方案数问题==动态规划问题。由于只能往下或右走,递归思考,每一点a[i][j]的方案数必由其上方a[i-1][j]或左侧a[i][j-1]得到。问题关键点在于统计的是能被K整除的路径数目,看一下示例1,如果走到(3,3)对3求余为0,因为a[3][3]=2,那么走到a[3][2]或a[2][3]时其余数必须为1。但是我们不能用递归函数去逆推,哪样复杂度会很高。因此需要统计每一个点对K求余的所有方案数,也就是说当我们推导到a[i][j]时,必须知道从起点走到a[i][j]对K求余为0的所有方案数,对K求余为1的所有方案数,对K求余为2的方案数.......求余为K-1的方案数。幸运的是K的值不大于50,因此可以定义二维数组dp[i][j][x],表示当走到(i,j)这个点时对K求余为x的方案数。数学问题,如果小于K的数a和b,使得  (a+b)%k=x,那么a的值是多少呢?

                                        a=(x-b+k)%k。

        当然也可以用另一种方法,遍历dp[i-1][j]和dp[i][j-1]的所有余数方案,推出dp[i][j]的所有余数方案。考虑到我和你们都不太会用二维和三维的vector结构....因此下面代码使用滚动数组来实现递推。滚动数组的使用依据是dp[i][j]只会用到其上一行的dp[i-1][j]和同一行的dp[i][j-1]。

class Solution
{
public:int numberOfPaths(vector<vector<int>>& grid, int k){int dp[2][50005][50]= {0},mod=1e9+7;/**< dp[0]和dp[1]来回滚动 */int i,j,l,n=grid.size(),m=grid[0].size();/**< n行m列的grid数组 */dp[0][1][grid[0][0]%k]=1;/**< 第一个元素对K求余 */for(i=2; i<=m; i++) /**< 计算第一行的所有结果,不然无法滚动...... */for(j=0; j<k; j++)if(dp[0][i-1][j])dp[0][i][(j+grid[0][i-1])%k]=1;int x=0,y=1;/**< x和y滚起来 */for(l=2; l<=n; l++){for(i=1; i<=m; i++) /**< 用dp[x]推导出dp[y] */{for(j=0; j<k; j++)/**< 先把dp[y]清0 */dp[y][i][j]=0;for(j=0; j<k; j++){if(dp[x][i][j])dp[y][i][(j+grid[l-1][i-1])%k]=(dp[y][i][(j+grid[l-1][i-1])%k]+dp[x][i][j])%mod;if(dp[y][i-1][j])dp[y][i][(j+grid[l-1][i-1])%k]=(dp[y][i][(j+grid[l-1][i-1])%k]+dp[y][i-1][j])%mod;}}swap(x,y);/**< 交换x,y实现滚动 */}return dp[x][m][0];}
};

小技巧:一般做这类题目会先把数组所有元素替换为对K求余的结果,虽然我没做这个步骤。

力扣周赛难度较低,可能是为了吸引更多的参赛者吧..............当然要想快速作对也不容易。初学者可以先尝试通过周赛一二题,如果能每天刷几个题,那么周赛三四题经过半年左右的训练就差不多了。

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

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

相关文章

Kafka由浅入深(二)—— 生产者工作原理

1、生产者的流程架构 生产者主体逻辑整个生产者客户端由两个线程协调运行&#xff0c;这两个线程分别为主线程和Sender 线程&#xff08;发送线程&#xff09;。 1.1 主线程&#xff1a; 在主线程中由KafkaProducer 创建消息&#xff0c;然后通过可能的拦截器、序列化器和分区…

带你吃透Servlet核心编程下篇(完整图文教程)

本文被 系统学习JavaWeb 收录点击订阅专栏 文章目录1 Http协议1.1 什么是 HTTP 协议1.2 GET请求与POST请求1.3 响应的HTTP协议格式1.4 MIME数据类型2 HttpServletRequest类2.1 HttpServletRequest说明及常用方法2.2 HttpServletRequest类演示2.3 获取请求表单中的参数值&#x…

车车基础知识扫盲

排量 排量是指发动机气缸工作容积之和。所谓工作容积就是活塞在一个冲程内经过的区域的体积。气缸的总容积减去活塞的工作容积&#xff0c;剩下的就是压缩容积&#xff0c;压缩容积是用来燃烧的。 排量的单位是升(L)&#xff0c;常见的排量的标识有三种&#xff0c;T&#xff…

SpringMvc模块

SpingMVC 模块 简介 Spring MVC是一种基于MVC架构模式的轻量级Web框架。 SpringMVC处理过程 Spring MVC的处理过程&#xff1a; DispatcherServlet 接收用户的请求找到用于处理request的 handler 和Interceptors&#xff0c;构造成 HandlerExecutionChain执行链找到 handle…

宏任务与微任务

原文:做一些动图,学习一下EventLoop (https://juejin.cn/post/6969028296893792286)一、任务队列JavaScript 是单线程执行的语言, 在同一时间只能干一件事情。如果前面的任务很耗时后面的任务就会一直等待,为了解决这个问题,js中出现了同步任务和异步任务 1.1 同步任务在主…

Linux服务器部署Mysql5.7全过程记录

1、先下载安装包文件 mysql-5.7.27-linux-glibc2.12-x86_64.tar Mysql5.7.27 Linux安装包 链接&#xff1a;https://pan.baidu.com/s/1p4KmDp5O2bGJLXUHOHMQFQ 提取码&#xff1a;4692 2、解压 cd /usr/local 切换到安装包所在目录 tar -zxvf mysql-5.7.30-l…

【数据获取】可以公开获取到的百度迁徙数据

百度迁徙数据是一种较为常用的互联网数据&#xff0c;在之前的文章里小编已经讲了百度迁徙数据是什么、怎么获取、该如何处理、怎么用它做和弦图这些内容。但是其中数据的获取部分一直没有详细讲解&#xff0c;那么该如何获取它呢&#xff1f; 今天&#xff0c;就告诉大家一个…

教学设计题-教学过程

空间中直线与平面之间的位置关系 生活中的三种位置关系的实例 直线在平面内&#xff1a;开门关门时&#xff0c;门轴所在的直线在门所在平面内 直线与平面相交&#xff1a;操场上&#xff0c;升旗的旗杆所在直线与地面所在平面相交 直线与平面平行&#xff1a;黑板的一条边所在…

护肤 第三课

皮肤的生长周期一般是1-2个月 所以护肤品想要其效果 一般就是这个周期才会有效果 外用护肤品只能渗透到表皮层或者真皮层的表层&#xff0c;只有医疗美容的方法才有机会到真皮层 黑色素 黑色素细胞在基底层 黑色素细胞能产生黑色素 黑色素的作用&#xff1a;吸收和散射紫外线…

A Survey on Big Data Market: Pricing, Trading and Protection

基于大数据市场&#xff1a;定价、交易、保护的研究 作者&#xff1a;FAN LIANG, WEI YU , DOU AN, QINGYU YANG, XINWEN FU, AND WEI ZHAO 文章目录基于大数据市场&#xff1a;定价、交易、保护的研究Abstract1.Intro2.大数据的基本概念2.1.大数据的定义2.2.大数据的好处和挑…

【23秋招c++后端面试技术突围】mysql通俗易懂的数据库连接池原理及模拟实现

什么是数据库连接池&#xff1f; 当系统使用JDBC技术访问数据库时会创建一个connection对象&#xff0c;而该对象的创建过程是非常消耗资源的&#xff0c;并且创建对象的时间也特别长&#xff0c;假设系统一天有1万次的访问量&#xff0c;那么一天就会有1万个connection对象被…

Acetal-NHS (SDMB),乙缩醛-琥珀酰亚胺酯

An English name&#xff1a;Acetal-NHS (SDMB) Chinese name&#xff1a;乙缩醛-琥珀酰亚胺酯 Item no&#xff1a;X-GF-0136 Density: PEG density is approximately 1.125 g/mL Molecular formula&#xff1a; Physical form&#xff1a;PEG products generally appear…

CMake中find_file的使用

CMake中的命令find_file用于查找指定文件(named file)的完整路径&#xff0c;其格式如下&#xff1a;将创建一个由<VAR>命名的缓存条目即cache变量&#xff0c;将<VAR>的值存入CMakeCache.txt中);或如果指定了NO_CACHE&#xff0c;由<VAR>命名的普通变量来存…

文件IO操作笔记

目录 1.文件操作 2.File类 3.流&#xff08;针对文件内容操作读写&#xff09; 3.1 InputStream 3.2 Scanner 4.练习 1.文件操作 狭义文件就是存储在硬盘上的数据&#xff0c;以“文件”为单位 广义上的文件就是操作系统负责管理硬件资源&#xff0c;操作系统&#xff08;…

按钮(Button)组件

1.按钮组件的属性 属性 说明 onPressed 必填参数&#xff0c;按下按钮时触发的回调&#xff0c;接收一个方法&#xff0c;传null表示按钮禁用&#xff0c;会显示禁用相关样式 child 子组件 style 通过ButtonStyle装饰 ButtonStylee里面的常用的参数 属性名称 值类型 …

15 个实用的 Linux find 命令示例

除了在目录结构下查找文件的基本操作外&#xff0c;我们还可以使用 find 命令执行一些实际操作&#xff0c;这将使我们的命令行之旅变得轻松。 在本文中&#xff0c;让我们回顾 15 个 Linux find 命令的实际示例&#xff0c;它们对新手和专家都非常有用。 首先&#xff0c;在…

公众号网课查题功能搭建系统使用

公众号网课查题功能搭建系统使用 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&…

图学习——02.Graph Neural Network

Graph Neural Network GCN A矩阵表示邻接矩阵&#xff0c;I矩阵表示单位阵&#xff0c;D~矩阵是对A~的矩阵按行求和后把每行的值写在对角线上&#xff08;度矩阵&#xff0c;包括自连接的度&#xff09;&#xff0c;W(l)是要学习的参数&#xff0c;H(l)是这一层的节点的特征 …

2键/双按键触摸触控检测IC ,VK3602KA抗电源电压波动干扰/超高稳定性,适用门禁、台灯,家电等电源供电的应用

型号&#xff1a;VK3602KA 品牌&#xff1a;VINKA/永嘉微电 封装形式&#xff1a;SOP8 年份&#xff1a;新年份 KPP2436 VK3602KA具有2个触摸按键&#xff0c;可用来检测外部触摸按键上人手的触摸动作。该芯片具有较高的集成度&#xff0c;仅需极少的外部组件便可实现触摸按…

Vue基础语法(二)

目录 一、条件判断 1、概念 2、v-if、v-else-if、v-else 3、v-show 4、v-show与v-if的异同 二、v-for 1、遍历数组 2、遍历对象 3、key属性 三、数据更新检测 1、末尾的添加、删除 2、前面的插入、删除 3、splice(index,length,替换内容) 4、sort()排序 5、反转&a…