4
int dx[4] = {1, 0, -1, 0};5
int dy[4] = {0, 1, 0, -1};6
int countPaths(vector<vector<int>> &grid) {7
vector<vector<int>> dp(grid.size(), vector<int>(grid[0].size(), -1));9
for (int i = 0; i < grid.size(); i++) {10
for (int j = 0; j < grid[0].size(); j++) {11
count = (count % mod + dfs(i, j, grid, dp) % mod) % mod;14
return (int)count % mod;18
bool isvalid(int x, int y, vector<vector<int>> &grid) {19
if (x < 0 or x >= grid.size() or y < 0 or y >= grid[0].size()) return false;22
int dfs(int x, int y, vector<vector<int>> &grid, vector<vector<int>> &dp) {23
if (dp[x][y] != -1) return dp[x][y];26
for (int i = 0; i < 4; i++) {27
if (isvalid(x + dx[i], y + dy[i], grid) and grid[x][y] > grid[x + dx[i]][y + dy[i]]) {28
ans = (ans % mod + dfs(x + dx[i], y + dy[i], grid, dp) % mod) % mod;31
return dp[x][y] = ans % mod;