Woodyiiiiiii / LeetCode

My private record of Leetcode solution

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Leetcode 2435. Paths in Matrix Whose Sum Is Divisible by K

Woodyiiiiiii opened this issue · comments

这道题很显然用DP。而且根据mn的范围来看,估计要mn*k的时间复杂度。这是一道三维数组DP题,即DP数组为dp[m][n][k]。

问题是,DP数组该存什么值,还有状态转化方程。

这里我们直接把dp[i][j][z]等同于所有之前i和j数值之和的余数为z的个数。状态转化方程可以用逆推,(x + cur) % k = z;则求x值的方程为dp[i][j][z] += dp[i - 1][j][(z + k - cur) % k]

可以看出题目中有除数k的,要善用%。

class Solution {
    public int numberOfPaths(int[][] grid, int k) {
        int m = grid.length;
        int n = grid[0].length;
        int[][][] dp = new int[m][n][k];
        int mod = 1000000007;
        
        for (int i = 0; i < m; ++i) {
            for (int j = 0; j < n; ++j) {
                int cur = grid[i][j] % k;
                if (i == 0 && j == 0) {
                    dp[i][j][cur] = 1;
                    continue;
                }
                
                for (int z = 0; z < k; ++z) {
                    // (x + cur) % k = z;
                    if (i > 0) {
                        dp[i][j][z] += dp[i - 1][j][(z + k - cur) % k];
                        dp[i][j][z] %= mod;
                    }
                    if (j > 0) {
                        dp[i][j][z] += dp[i][j - 1][(z + k - cur) % k];
                        dp[i][j][z] %= mod;
                    }
                }
            }
        }
        
        return dp[m - 1][n - 1][0];
    }
}