@@ -16,17 +16,38 @@ class Solution {
1616 int numberOfPaths (vector<vector<int >>& grid, int k) {
1717 int n = grid.size ();
1818 int m = grid[0 ].size ();
19- vector<vector<vector<int >>>Dp (n,vector<vector<int >>(m,vector<int >(k)));
20- // Tabulation
21- for (int s = 0 ; s < k; s++)if ((s + grid[0 ][0 ]) % k == 0 )Dp[0 ][0 ][s] = 1 ;
22- for (int i = 0 ; i < n; i++){
19+ // vector<vector<vector<int>>>Dp(n,vector<vector<int>>(m,vector<int>(k)));
20+ // // Tabulation
21+ // for(int s = 0; s < k; s++)if((s + grid[0][0]) % k == 0)Dp[0][0][s] = 1;
22+ // for(int i = 0; i < n; i++){
23+ // for(int j = 0; j < m; j++){
24+ // for(int s = 0; s < k; s++){
25+ // if(i > 0)Dp[i][j][s] = (Dp[i][j][s] + Dp[i - 1][j][(s + grid[i][j]) % k]) % 1000000007;
26+ // if(j > 0)Dp[i][j][s] = (Dp[i][j][s] + Dp[i][j - 1][(s + grid[i][j]) % k]) % 1000000007;
27+ // }
28+ // }
29+ // }
30+ // return Dp[n - 1][m - 1][0];
31+
32+ // Space Optimization
33+ vector<vector<int >>prev (m,vector<int >(k));
34+ for (int s = 0 ; s < k; s++)if ((s + grid[0 ][0 ]) % k == 0 )prev[0 ][s] = 1 ;
35+
36+ for (int j = 1 ; j < m; j++)
37+ for (int s = 0 ; s < k; s++)
38+ prev[j][s] += prev[j - 1 ][(s + grid[0 ][j]) % k];
39+
40+ for (int i = 1 ; i < n; i++){
41+ vector<vector<int >>curr (m,vector<int >(k));
2342 for (int j = 0 ; j < m; j++){
2443 for (int s = 0 ; s < k; s++){
25- if (i > 0 )Dp[i][j][s] = (Dp[i][j][s] + Dp[i - 1 ][j][(s + grid[i][j]) % k]) % 1000000007 ;
26- if (j > 0 )Dp[i][j][s] = (Dp[i][j][s] + Dp[i][j - 1 ][(s + grid[i][j]) % k]) % 1000000007 ;
44+ if (i > 0 )curr[j][s] = (curr[j][s] + prev[j][(s + grid[i][j]) % k]) % 1000000007 ;
45+ if (j > 0 )curr[j][s] = (curr[j][s] + curr[j - 1 ][(s + grid[i][j]) % k]) % 1000000007 ;
46+
2747 }
2848 }
49+ prev = curr;
2950 }
30- return Dp[n - 1 ] [m - 1 ][0 ];
51+ return prev [m - 1 ][0 ];
3152 }
3253};
0 commit comments