# LC 2684. Maximum Number of Moves in a Grid ### [Problem link](https://leetcode.com/problems/maximum-number-of-moves-in-a-grid/) ###### tags: `leedcode` `python` `medium` `DP` You are given a **0-indexed** <code>m x n</code> matrix <code>grid</code> consisting of **positive** integers. You can start at **any** cell in the first column of the matrix, and traverse the grid in the following way: - From a cell <code>(row, col)</code>, you can move to any of the cells: <code>(row - 1, col + 1)</code>, <code>(row, col + 1)</code> and <code>(row + 1, col + 1)</code> such that the value of the cell you move to, should be **strictly** bigger than the value of the current cell. Return the **maximum** number of **moves** that you can perform. **Example 1:** <img alt="" src="https://assets.leetcode.com/uploads/2023/04/11/yetgriddrawio-10.png" style="width: 201px; height: 201px;" /> ``` Input: grid = [[2,4,3,5],[5,4,9,3],[3,4,2,11],[10,9,13,15]] Output: 3 Explanation: We can start at the cell (0, 0) and make the following moves: - (0, 0) -> (0, 1). - (0, 1) -> (1, 2). - (1, 2) -> (2, 3). It can be shown that it is the maximum number of moves that can be made. ``` **Example 2:** ``` <img alt="" src="https://assets.leetcode.com/uploads/2023/04/12/yetgrid4drawio.png" /> Input: grid = [[3,2,4],[2,1,9],[1,1,7]] Output: 0 Explanation: Starting from any cell in the first column we cannot perform any moves. ``` **Constraints:** - <code>m == grid.length</code> - <code>n == grid[i].length</code> - <code>2 <= m, n <= 1000</code> - <code>4 <= m * n <= 10<sup>5</sup></code> - <code>1 <= grid[i][j] <= 10<sup>6</sup></code> ## Solution 1 - DP ```python= class Solution: def maxMoves(self, grid: List[List[int]]) -> int: m = len(grid) n = len(grid[0]) dp = [[0 for _ in range(n)] for _ in range(m)] for j in range(n-2, -1, -1): for i in range(m): if 0 <= i - 1 < m and grid[i][j] < grid[i - 1][j + 1]: dp[i][j] = max(dp[i][j], dp[i - 1][j + 1] + 1) if grid[i][j] < grid[i][j + 1]: dp[i][j] = max(dp[i][j], dp[i][j + 1] + 1) if 0 <= i + 1 < m and grid[i][j] < grid[i + 1][j + 1]: dp[i][j] = max(dp[i][j], dp[i + 1][j + 1] + 1) return max(list(zip(*dp))[0]) ``` >### Complexity >m = grid.length >n = grid[i].length >| | Time Complexity | Space Complexity | >| ----------- | --------------- | ---------------- | >| Solution 1 | O(mn) | O(mn) | ## Note x