A.每日一题——2435. 矩阵中和能被 K 整除的路径

题目链接:2435. 矩阵中和能被 K 整除的路径(困难)

算法原理:

解法一:动态规划

击败78.82%

时间复杂度O (mnk)

解法二:记忆化搜索DFS

击败24.63%

时间复杂度O (mnk)

整体思路与上面的动态规划大致相同,只是深搜顺序是从(m-1,n-1)开始深搜到(0,0)位置,深搜过程中注意不越界和起点的问题,如果备忘录里存了结果就直接返回备忘录就行,具体可看下面的Java代码,相信大家理解动态规划之后,这个就很容易能看懂

Java代码:

java 复制代码
class Solution {
    //动态规划写法
    public int numberOfPaths(int[][] grid, int k) {
        int MOD=1000000007;
        int m=grid.length,n=grid[0].length;
        int[][][] dp=new int[m+1][n+1][k];
        for(int i=1;i<=m;i++){
            for(int j=1;j<=n;j++){
                //初始化起点部分
                if(i==1&&j==1){
                    int value=grid[0][0]%k;
                    dp[i][j][value]=1;
                    continue;
                }
                //处理非起点部分
                int val=grid[i-1][j-1]%k;//当前格子的余数
                for(int r=0;r<k;r++){
                    //确定余数r需要的前一个状态的余数prev
                    int prev=(r-val+k)%k;
                    dp[i][j][r]=(dp[i][j-1][prev]+dp[i-1][j][prev])%MOD;
                }
            }
        }
        return dp[m][n][0];
    }
}
java 复制代码
class Solution {
    //记忆化搜索DFS写法
    private static final int MOD=1_000_000_007;
    public int numberOfPaths(int[][] grid, int k) {
        int m=grid.length,n=grid[0].length;
        int[][][] memo=new int[m][n][k];
        //备忘录初始化为-1表示没有计算过
        for(int[][] mat:memo)
            for(int[] row:mat)
                Arrays.fill(row,-1);
        return dfs(m-1,n-1,0,memo,grid,k);
    }
    private int dfs(int i,int j,int r,int[][][] memo,int[][] grid,int k){
        if(i<0||j<0) return 0;//出界
        int val=grid[i][j]%k;
        //确定r需要的prev
        int prev=(r-val+k)%k;
        //起点的情况:prev==0时说明r==val
        if(i==0&&j==0) return prev==0?1:0;
        //先去备忘录找找
        if(memo[i][j][r]!=-1) return memo[i][j][r];
        int ret1=dfs(i-1,j,prev,memo,grid,k);
        int ret2=dfs(i,j-1,prev,memo,grid,k);
        return memo[i][j][r]=(ret1+ret2)%MOD;
    }
}
相关推荐
菜鸡爱玩4 小时前
线性代数矩阵相乘
线性代数·算法·矩阵
devilnumber7 小时前
Java 递归算法 详解 + 核心要点 + 实战运用 + 避坑指南
java·开发语言·算法
asdfg12589639 小时前
JavaBean是什么?怎么理解?有什么用途?
java·开发语言
dsyyyyy11019 小时前
JavaScript变量
开发语言·javascript·ecmascript
‎ദ്ദിᵔ.˛.ᵔ₎9 小时前
双指针、滑动窗口、前缀和、二分查找 算法
算法
顾北顾9 小时前
多头注意力机制
人工智能·深度学习·算法
H178535090969 小时前
SolidWorks_基于草图的实体特征20_特征错误排查
算法·3d建模·solidworks
hujinyuan2016010 小时前
2025年12月中国电子学会青少年机器人技术等级考试试卷(二级) 真题+答案
人工智能·算法·机器人
z落落10 小时前
C#WinForm 窗体切换与窗体传值(登录跳转案例)+WinForm 窗体传值(从上往下传、从下往上传)
开发语言·windows·c#
allway210 小时前
How to Echo Multiline to a File in Bash [3 Methods]
开发语言·chrome·bash