top-down DP Solution
Code
# Code
```cpp []
class Solution {
public:
    int find(int r, int c, int nut, vector<vector<int>>& coins, vector<vector<vector<int>>>& dp){
        // return if out of grid
        if(r >= coins.size() || c >= coins[0].size()) return INT_MIN;
        // if last cell
        if(r==coins.size()-1 && c==coins[0].size()-1){
            // if neutralizer avaliable, use it to return max value otherwise return cell value
            if(nut<2) return max(0, coins[r][c]);
            return coins[r][c];
        }
        // if already calculated for this cell with used neutralizers
        if(dp[r][c][nut] != INT_MIN) return dp[r][c][nut];

        int skip = INT_MIN;
        // use newutralizer if available, do not add coins
        if(coins[r][c] < 0 && nut<2){
            skip = max(find(r, c+1, nut+1, coins, dp), find(r+1, c, nut+1, coins, dp));
        }
        // not use neutralizer, add the coins
        int pick = coins[r][c] + max(find(r, c+1, nut, coins, dp), find(r+1, c, nut, coins, dp));
                
        dp[r][c][nut] = max(skip, pick);
        return dp[r][c][nut];
    }
    int maximumAmount(vector<vector<int>>& coins) {
        // dp[row][col][neut_used]
        vector<vector<vector<int>>> dp(coins.size(), vector<vector<int>> (coins[0].size(), vector<int> (3, INT_MIN)));

        // (curr_row, curr_col, neutralizers used, coins, dp)
        return find(0, 0, 0, coins, dp);
    }
};
```
['Dynamic Programming', 'C++']