当前位置: 首页 > news >正文

2435. 矩阵中和能被 K 整除的路径(leetcode)

文章目录

  • 写在前面
  • 题目来源
  • 思路
  • code

写在前面

看题解看了半天都看不懂,看了视频也看了好久······,最后还是自己手动模拟才懂的,大佬们写的代码非常好,自己根本想不到该如何用代码实现出来,还是得多刷题,多见一些新题型

题目来源

这里~~~~~~~QWQ

思路

考点:DP+三维数组
这里用到三维是因为坐标需要二维来建立,另外每个坐标还需要存储路径的数量,因此必须多开一维
既然是整除的题目,那必然跟取模有很大关系,例如 14 + 4 对 3 取模 14+4对3取模 14+43取模 我们可以看成 14 % 3 + 4 % 3 = ( 2 + 1 ) % 3 = 0 14\%3+4\%3=(2+1)\%3=0 14%3+4%3=(2+1)%3=0
首先定义 f [ i ] [ j ] [ v ] 表示从左上走到 ( i , j ) ,且路径和模 k 的结果为 v 时的路径数 f[i][j][v]表示从左上走到 (i,j),且路径和模 k 的结果为 v 时的路径数 f[i][j][v]表示从左上走到(i,j),且路径和模k的结果为v时的路径数
先看样例:(k=3)

那么路径和取模3为:

2 1 2
2 (2,1) (0,1,1)
2 (0,0,2) (0,0,1,2,2,2)

首先先定义边界, f [ 0 ] [ 0 ] [ 2 ] = 1 , 至于 f [ 0 ] [ 0 ] [ 0 ] 和 f [ 0 ] [ 0 ] [ 1 ] 肯定为 0 f[0][0][2]=1,至于f[0][0][0]和f[0][0][1]肯定为0 f[0][0][2]=1,至于f[0][0][0]f[0][0][1]肯定为0
然后 f [ 0 ] [ 1 ] [ 1 ] = 1 ⋅ ⋅ ⋅ ⋅ ⋅ ⋅ ,先看 f [ 1 ] [ 1 ] 这个点,每个点只跟上边的点和左边的点有关,由于 g r i d [ i ] [ j ] = 0 , 那么加上左边和上边的路径和分别为 1 , 2 ,所以 f [ 1 ] [ 1 ] [ 1 ] = f [ 1 ] [ 1 ] [ 2 ] = 1 , 后面同理,最后算的是 f [ m − 1 ] [ n − 1 ] [ 0 ] , 算出最后可以被 3 整除的路径数量 f[0][1][1]=1······,先看f[1][1]这个点,每个点只跟上边的点和左边的点有关,由于grid[i][j]=0,那么加上左边和上边的路径和分别为1,2,所以f[1][1][1]=f[1][1][2]=1,后面同理,最后算的是f[m-1][n-1][0],算出最后可以被3整除的路径数量 f[0][1][1]=1⋅⋅⋅⋅⋅⋅,先看f[1][1]这个点,每个点只跟上边的点和左边的点有关,由于grid[i][j]=0,那么加上左边和上边的路径和分别为12,所以f[1][1][1]=f[1][1][2]=1,后面同理,最后算的是f[m1][n1][0],算出最后可以被3整除的路径数量

模拟如此,代码如何实现呢?

参考模拟,状态转移方程就为:
f [ i + 1 ] [ j + 1 ] [ v ] = ( f [ i + 1 ] [ j ] [ ( v + k − g r i d [ i ] [ j ] % k ) % k ] + f [ i ] [ j + 1 ] [ ( v + k − g r i d [ i ] [ j ] % k ) % k ] ) ] % m o d f[i+1][j+1][v]=(f[i+1][j][(v+k-grid[i][j]\%k)\%k]+f[i][j+1][(v+k-grid[i][j]\%k)\%k])]\%mod f[i+1][j+1][v]=(f[i+1][j][(v+kgrid[i][j]%k)%k]+f[i][j+1][(v+kgrid[i][j]%k)%k])]%mod
首先,防止下标越界,让 i 和 j i和j ij都+1
f [ i + 1 ] [ j + 1 ] [ v ] 为路径和模 k 的结果为 v 时的路径数 f[i+1][j+1][v]为路径和模 k 的结果为 v 时的路径数 f[i+1][j+1][v]为路径和模k的结果为v时的路径数
( v + k − g r i d [ i ] [ j ] % k ) % k 本质上是 v − g r i d [ i ] [ j ] ,即当前 v 的状态由上边以及左边 v − g r i d [ i ] [ j ] 状态而来 (v+k-grid[i][j]\%k)\%k本质上是v-grid[i][j],即当前v的状态由上边以及左边v-grid[i][j]状态而来 (v+kgrid[i][j]%k)%k本质上是vgrid[i][j],即当前v的状态由上边以及左边vgrid[i][j]状态而来
至于取模k的操作就是防止下标越界

接下来看代码

code

class Solution {
public:int numberOfPaths(vector<vector<int>>& grid, int k) {int m=grid.size(),n=grid[0].size();int mod=1e9+7;int f[m+1][n+1][k];memset(f,0,sizeof f);f[1][0][0]=1;//初始化for(int i=0;i<m;++i)for(int j=0;j<n;++j)for(int v=0;v<k;++v){f[i+1][j+1][v]=(f[i+1][j][(v+k-grid[i][j]%k)%k]+f[i][j+1][(v+k-grid[i][j]%k)%k])%mod;}return f[m][n][0];}
};

制作不易,点个赞吧QVQ

相关文章:

  • 详解Xilinx FPGA高速串行收发器GTX/GTP(5)--详解8B10B编解码
  • Mojo中值的所有权简介
  • 区块链的搭建和运维4
  • 数据可视化Axure大屏原型制作分享
  • CAN 应用编程基础-I.MX6U嵌入式Linux C应用编程学习笔记基于正点原子阿尔法开发板
  • 华为OD-D卷找座位
  • 计算机毕业设计选题推荐-生活垃圾治理系统-Java/Python项目实战
  • 苹果应用程序清理卸载工具:App Cleaner Uninstaller Pro for Mac
  • Python设计模式 - 抽象工厂模式
  • Java学习Day20
  • RabbitMQ、Kafka对比(超详细),Kafka、RabbitMQ、RocketMQ的区别
  • 接口自动化测试框架中动态参数接口,加密接口,签名接口你们是怎么处理的?
  • TCP如何建立长连接
  • Jar工具完全指南:从入门到精通
  • C语言学习——函数
  • 【Leetcode】104. 二叉树的最大深度
  • 【干货分享】SpringCloud微服务架构分布式组件如何共享session对象
  • axios 和 cookie 的那些事
  • js对象的深浅拷贝
  • Mocha测试初探
  • Spring Boot快速入门(一):Hello Spring Boot
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • 初识 beanstalkd
  • 从setTimeout-setInterval看JS线程
  • 关于for循环的简单归纳
  • 计算机在识别图像时“看到”了什么?
  • 简单易用的leetcode开发测试工具(npm)
  • 排序算法之--选择排序
  • 前端_面试
  • 如何优雅的使用vue+Dcloud(Hbuild)开发混合app
  • 使用agvtool更改app version/build
  • -- 数据结构 顺序表 --Java
  • 数组大概知多少
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 用 Swift 编写面向协议的视图
  • 中文输入法与React文本输入框的问题与解决方案
  • 整理一些计算机基础知识!
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • # .NET Framework中使用命名管道进行进程间通信
  • ## 基础知识
  • #我与虚拟机的故事#连载20:周志明虚拟机第 3 版:到底值不值得买?
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • $refs 、$nextTic、动态组件、name的使用
  • (Redis使用系列) Springboot 使用redis的List数据结构实现简单的排队功能场景 九
  • (zt)最盛行的警世狂言(爆笑)
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (附源码)ssm旅游企业财务管理系统 毕业设计 102100
  • (剑指Offer)面试题34:丑数
  • (十三)Maven插件解析运行机制
  • (转)我也是一只IT小小鸟
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .net web项目 调用webService
  • .net 微服务 服务保护 自动重试 Polly
  • .NET 中使用 Mutex 进行跨越进程边界的同步