<p>You are given a square <code>board</code>&nbsp;of characters. You can move on the board starting at the bottom right square marked with the character&nbsp;<code>&#39;S&#39;</code>.</p>

<p>You need&nbsp;to reach the top left square marked with the character <code>&#39;E&#39;</code>. The rest of the squares are labeled either with a numeric character&nbsp;<code>1, 2, ..., 9</code> or with an obstacle <code>&#39;X&#39;</code>. In one move you can go up, left or up-left (diagonally) only if there is no obstacle there.</p>

<p>Return a list of two integers: the first integer is the maximum sum of numeric characters you can collect, and the second is the number of such paths that you can take to get that maximum sum, <strong>taken modulo <code>10^9 + 7</code></strong>.</p>

<p>In case there is no path, return&nbsp;<code>[0, 0]</code>.</p>

<p>&nbsp;</p>
<p><strong class="example">Example 1:</strong></p>
<pre><strong>Input:</strong> board = ["E23","2X2","12S"]
<strong>Output:</strong> [7,1]
</pre><p><strong class="example">Example 2:</strong></p>
<pre><strong>Input:</strong> board = ["E12","1X1","21S"]
<strong>Output:</strong> [4,2]
</pre><p><strong class="example">Example 3:</strong></p>
<pre><strong>Input:</strong> board = ["E11","XXX","11S"]
<strong>Output:</strong> [0,0]
</pre>
<p>&nbsp;</p>
<p><strong>Constraints:</strong></p>

<ul>
	<li><code>2 &lt;= board.length == board[i].length &lt;= 100</code></li>
</ul>
class Solution:
    def pathsWithMaxScore(self, board: List[str]) -> List[int]:
        n = len(board)
        mod = 10**9 + 7
        
        # Initialize dp arrays
        dp_sum = [[0] * n for _ in range(n)]
        dp_paths = [[0] * n for _ in range(n)]
        
        # Set the starting point
        dp_paths[n-1][n-1] = 1
        
        # Fill the dp arrays
        for i in range(n-1, -1, -1):
            for j in range(n-1, -1, -1):
                if board[i][j] == 'X' or (i == n-1 and j == n-1):
                    continue
                
                # Check the three possible moves: up, left, and up-left
                for di, dj in [(1, 0), (0, 1), (1, 1)]:
                    ni, nj = i + di, j + dj
                    if 0 <= ni < n and 0 <= nj < n and dp_paths[ni][nj] > 0:
                        new_sum = dp_sum[ni][nj] + (int(board[i][j]) if board[i][j] != 'E' and board[i][j] != 'S' else 0)
                        if new_sum > dp_sum[i][j]:
                            dp_sum[i][j] = new_sum
                            dp_paths[i][j] = dp_paths[ni][nj]
                        elif new_sum == dp_sum[i][j]:
                            dp_paths[i][j] = (dp_paths[i][j] + dp_paths[ni][nj]) % mod
        
        # The result is at the top left corner
        return [dp_sum[0][0], dp_paths[0][0]]

# Example usage:
solution = Solution()
board = ["E23","2X2","12S"]
print(solution.pathsWithMaxScore(board))  # Output: [7, 1]
17400