该题解使用动态规划的方法求解。dp[i][j]存储从(i, j)到终点的最大得分和对应的路径数。对于每个位置(i, j),我们考虑从下方、右方和右下方三个方向来的路径,取这三个方向中得分最高的路径,如果有多条路径得分相同,则将它们的路径数相加。最终,dp[0][0]就存储了从起点到终点的最大得分和对应的路径数。
时间复杂度: O(n^2)
空间复杂度: O(n^2)
class Solution:
def pathsWithMaxScore(self, board: List[str]) -> List[int]:
n = len(board)
dp = [[(-float('inf'), -float('inf'))] * n for _ in range(n)] # <score, ways>
dp[-1][-1] = (0, 1) # Base case
for i in range(n-2, -1, -1):
dp[i][-1] = (dp[i+1][-1][0] + int(board[i][-1]) if board[i][-1] != 'X' else -float('inf'), dp[i+1][-1][1])
for j in range(n-2, -1, -1):
dp[-1][j] = (dp[-1][j+1][0] + int(board[-1][j]) if board[-1][j] != 'X' else -float('inf'), dp[-1][j+1][1])
for i in range(n-2, -1, -1):
for j in range(n-2, -1, -1):
if board[i][j] == 'X':
continue
cur_score = (int(board[i][j]) if board[i][j] != 'E' else 0)
a1, b1 = dp[i+1][j]
a2, b2 = dp[i][j+1]
a3, b3 = dp[i+1][j+1]
mx_score = max(a1, a2, a3)
ways = (b1 if a1 == mx_score else 0) + \
(b2 if a2 == mx_score else 0) + \
(b3 if a3 == mx_score else 0)
dp[i][j] = (mx_score + cur_score, ways)
MOD = 10 ** 9 + 7
return [0,0] if dp[0][0][0] == -float('inf') else [dp[0][0][0] % MOD, dp[0][0][1] % MOD]