File tree 1 file changed +30
-0
lines changed
1 file changed +30
-0
lines changed Original file line number Diff line number Diff line change
1
+ // Time: O(m * n)
2
+ // Space: O(n)
3
+
4
+ // dp with rolling window
5
+ class Solution {
6
+ public:
7
+ int maxProductPath (vector<vector<int >>& grid) {
8
+ static const int MOD = 1e9 + 7 ;
9
+ vector<vector<int64_t >> max_dp (2 , vector<int64_t >(size (grid[0 ])));
10
+ vector<vector<int64_t >> min_dp (2 , vector<int64_t >(size (grid[0 ])));
11
+ for (int i = 0 ; i < size (grid); ++i) {
12
+ for (int j = 0 ; j < size (grid[0 ]); ++j) {
13
+ if (i == 0 && j == 0 ) {
14
+ max_dp[0 ][0 ] = min_dp[0 ][0 ] = grid[0 ][0 ];
15
+ continue ;
16
+ }
17
+ auto curr_max = max (i > 0 ? max_dp[(i - 1 ) % 2 ][j] : max_dp[i % 2 ][j - 1 ],
18
+ j > 0 ? max_dp[i % 2 ][j - 1 ] : max_dp[(i - 1 ) % 2 ][j]);
19
+ auto curr_min = min (i > 0 ? min_dp[(i - 1 ) % 2 ][j] : min_dp[i % 2 ][j - 1 ],
20
+ j > 0 ? min_dp[i % 2 ][j - 1 ] : min_dp[(i - 1 ) % 2 ][j]);
21
+ if (grid[i][j] < 0 ) {
22
+ swap (curr_max, curr_min);
23
+ }
24
+ max_dp[i % 2 ][j] = curr_max * grid[i][j];
25
+ min_dp[i % 2 ][j] = curr_min * grid[i][j];
26
+ }
27
+ }
28
+ return max_dp[(size (grid) - 1 ) % 2 ].back () >= 0 ? max_dp[(size (grid) - 1 ) % 2 ].back () % MOD : -1 ;
29
+ }
30
+ };
You can’t perform that action at this time.
0 commit comments