网站建设ppt演示文档,重庆勘察设计网,哈尔滨网站建设推广,网站开发实习计划模板本文涉及知识点
C动态规划
LeetCode2435. 矩阵中和能被 K 整除的路径
给你一个下标从 0 开始的 m x n 整数矩阵 grid 和一个整数 k 。你从起点 (0, 0) 出发#xff0c;每一步只能往 下 或者往 右 #xff0c;你想要到达终点 (m - 1, n - 1) 。 请你返回路径和能被 k 整除的…本文涉及知识点
C动态规划
LeetCode2435. 矩阵中和能被 K 整除的路径
给你一个下标从 0 开始的 m x n 整数矩阵 grid 和一个整数 k 。你从起点 (0, 0) 出发每一步只能往 下 或者往 右 你想要到达终点 (m - 1, n - 1) 。 请你返回路径和能被 k 整除的路径数目由于答案可能很大返回答案对 109 7 取余 的结果。 示例 1
输入grid [[5,2,4],[3,0,5],[0,7,2]], k 3 输出2 解释有两条路径满足路径上元素的和能被 k 整除。 第一条路径为上图中用红色标注的路径和为 5 2 4 5 2 18 能被 3 整除。 第二条路径为上图中用蓝色标注的路径和为 5 3 0 5 2 15 能被 3 整除。 示例 2
输入grid [[0,0]], k 5 输出1 解释红色标注的路径和为 0 0 0 能被 5 整除。 示例 3 输入grid [[7,3,4,9],[2,3,6,2],[2,3,7,0]], k 1 输出10 解释每个数字都能被 1 整除所以每一条路径的和都能被 k 整除。
提示 m grid.length n grid[i].length 1 m, n 5 * 104 1 m * n 5 * 104 0 grid[i][j] 100 1 k 50
动态规划
动态规划的状态表示
dp[r][c][k] 记录从起点到达(r,c) 路径和%K k的方案数。空间复杂度O(mnk)
动态规划的转移方程
枚举前置状态(r,c,k) (r1,c1)是(r1,c)或(r,c1) dp[r1][c1][(kgrid[r1][c1])%K] dp[r][c][k] 单个状态转移的时间复杂度是O(1)** 总复杂度**O(mnk)
动态规划的填表顺序
先行后列行号和列号都从小到大。 由于只能下移不能上移所以行号小的一定是前置节点。由于只能右移不能左移所以行号相同列号小的是前置节点。
动态规划的初始值
全部为0。
动态规划的返回值
dp.back().back()[0]
代码
核心代码 templateint MOD 1000000007
class C1097Int
{
public:C1097Int(long long llData 0) :m_iData(llData% MOD){}C1097Int operator(const C1097Int o)const{return C1097Int(((long long)m_iData o.m_iData) % MOD);}C1097Int operator(const C1097Int o){m_iData ((long long)m_iData o.m_iData) % MOD;return *this;}C1097Int operator-(const C1097Int o){m_iData (m_iData MOD - o.m_iData) % MOD;return *this;}C1097Int operator-(const C1097Int o){return C1097Int((m_iData MOD - o.m_iData) % MOD);}C1097Int operator*(const C1097Int o)const{return((long long)m_iData * o.m_iData) % MOD;}C1097Int operator*(const C1097Int o){m_iData ((long long)m_iData * o.m_iData) % MOD;return *this;}C1097Int operator/(const C1097Int o)const{return *this * o.PowNegative1();}C1097Int operator/(const C1097Int o){*this / o.PowNegative1();return *this;}bool operator(const C1097Int o)const{return m_iData o.m_iData;}bool operator(const C1097Int o)const{return m_iData o.m_iData;}C1097Int pow(long long n)const{C1097Int iRet 1, iCur *this;while (n){if (n 1){iRet * iCur;}iCur * iCur;n 1;}return iRet;}C1097Int PowNegative1()const{return pow(MOD - 2);}int ToInt()const{return m_iData;}
private:int m_iData 0;;
};class Solution {public:int numberOfPaths(vectorvectorint grid, int K) {const int R grid.size();const int C grid[0].size();vectorvectorvectorC1097Int dp(R, vectorvectorC1097Int(C, vectorC1097Int(K)));dp[0][0][grid[0][0] % K] 1;for (int r 0; r R; r) {for (int c 0; c C; c) {for (int k 0; k K; k) {if (r 1 R) {dp[r 1][c][(k grid[r 1][c]) % K] dp[r][c][k];}if (c 1 C) {dp[r][c 1][(k grid[r][c 1]) % K] dp[r][c][k];}}}}return dp.back().back()[0].ToInt();}};单元测试
vectorvectorint grid;int k;TEST_METHOD(TestMethod11){grid { {5,2,4},{3,0,5},{0,7,2} }, k 3;auto res Solution().numberOfPaths(grid, k);AssertEx(2, res);}TEST_METHOD(TestMethod12){grid { {0,0} }, k 5;auto res Solution().numberOfPaths(grid, k);AssertEx(1, res);}TEST_METHOD(TestMethod13){grid { {7,3,4,9},{2,3,6,2},{2,3,7,0} }, k 1;auto res Solution().numberOfPaths(grid, k);AssertEx(10, res);}扩展阅读
我想对大家说的话工作中遇到的问题可以按类别查阅鄙人的算法文章请点击《算法与数据汇总》。学习算法按章节学习《喜缺全书算法册》大量的题目和测试用例打包下载。重视操作有效学习明确的目标 及时的反馈 拉伸区难度合适 专注闻缺陷则喜(喜缺)是一个美好的愿望早发现问题早修改问题给老板节约钱。子墨子言之事无终始无务多业。也就是我们常说的专业的人做专业的事。如果程序是一条龙那算法就是他的是睛失败反思成功 成功反思成功
视频课程
先学简单的课程请移步CSDN学院听白银讲师也就是鄙人的讲解。 https://edu.csdn.net/course/detail/38771 如何你想快速形成战斗了为老板分忧请学习C#入职培训、C入职培训等课程 https://edu.csdn.net/lecturer/6176
测试环境
操作系统win7 开发环境 VS2019 C17 或者 操作系统win10 开发环境 VS2022 C17 如无特殊说明本算法用**C**实现。