Cleanest Memoization JAVA code you will ever see || CLEAN CODE ||
Intuition\n Describe your first thoughts on how to solve this problem. \n\n# Approach\n Describe your approach to solving the problem. \n\n# Complexity\n- Time 
# Intuition\n<!-- Describe your first thoughts on how to solve this problem. -->\n\n# Approach\n<!-- Describe your approach to solving the problem. -->\n\n# Complexity\n- Time complexity:\n<!-- Add your time complexity here, e.g. $$O(n)$$ -->\n\n- Space complexity:\n<!-- Add your space complexity here, e.g. $$O(n)$$ -->\n\n# Code\n```\nclass Solution {\n    public int maxScore(List<List<Integer>> grid) {\n        Integer [][] dp = new Integer[grid.size()][grid.get(0).size()];\n        int ans = (int)(-1e9);\n        //Calling from every cell\n        for(int i =0 ; i < grid.size() ; i++){\n            for(int j =0 ; j < grid.get(0).size() ; j++){\n                ans= Math.max(helper(i,j,grid,dp),ans);\n            }\n        }\n        return ans;\n    }\n    int helper(int i , int j, List<List<Integer>> grid , Integer [][]dp){\n        if(i==grid.size()-1 && j==grid.get(0).size()-1){\n            return (int)(-1e9);\n        }\n        if(dp[i][j]!=null) return dp[i][j];\n        int right = (int)(-1e9),down =(int)(-1e9);\n        if(j<grid.get(0).size()-1){\n            right = (grid.get(i).get(j+1) - grid.get(i).get(j)) + Math.max(0,helper(i,j+1,grid,dp));\n        }\n        if(i<grid.size()-1){\n            down = (grid.get(i+1).get(j) - grid.get(i).get(j)) + Math.max(0,helper(i+1,j,grid,dp));\n        }\n        return dp[i][j]=Math.max(right ,down );\n    }\n}\n```
['Dynamic Programming', 'Recursion', 'Memoization', 'Java']