设 dp_{i,j,0/1} ,为第 i 行, j 格的最大权值和及路径方案数
1. 最大权值和 dp_{i,j,0}
dp_{i,j,0} = \max \begin{cases}
dp_{i+1, j+1, 0} & \text{if } dp_{i+1, j+1, 0} \neq -1 \\
dp_{i+1, j, 0} & \text{if } dp_{i+1, j, 0} \neq -1 \\
dp_{i, j+1, 0} & \text{if } dp_{i, j+1, 0} \neq -1
\end{cases} + w_{i,j}
2. 路径方案数 dp_{i,j,1}
dp_{i,j,1} = \left( \sum \begin{cases}
dp_{i+1, j+1, 1} & \text{if } dp_{i+1, j+1, 0} + w_{i,j} = dp_{i,j,0} \\
dp_{i+1, j, 1} & \text{if } dp_{i+1, j, 0} + w_{i,j} = dp_{i,j,0} \\
dp_{i, j+1, 1} & \text{if } dp_{i, j+1, 0} + w_{i,j} = dp_{i,j,0}
\end{cases} \right) \pmod{10^9+7}
class Solution {
public:
vector<int> pathsWithMaxScore(vector<string>& board) {
int n = board.size(), m = board[0].size();
vector dp(n, vector<array<int, 2>>(m, {-1, 0}));
constexpr int MOD = 1E9 + 7;
dp[n - 1][m - 1] = {0, 1};
for (int i = n - 1; i >= 0; i--) {
for (int j = m - 1; j >= 0; j--) {
if (i == n - 1 && j == m - 1 || board[i][j] == 'X') continue;
int w = (board[i][j] == 'E') ? 0 : (board[i][j] - '0');
if (i + 1 <= n - 1 && j + 1 <= m - 1 && dp[i + 1][j + 1][0] != -1) {
if (dp[i + 1][j + 1][0] + w > dp[i][j][0]) {
dp[i][j][0] = dp[i + 1][j + 1][0] + w;
dp[i][j][1] = dp[i + 1][j + 1][1];
} else if (dp[i + 1][j + 1][0] + w == dp[i][j][0]) {
dp[i][j][1] = (1LL * dp[i][j][1] + dp[i + 1][j + 1][1]) % MOD;
}
}
if (i + 1 <= n - 1 && dp[i + 1][j][0] != -1) {
if (dp[i + 1][j][0] + w > dp[i][j][0]) {
dp[i][j][0] = dp[i + 1][j][0] + w;
dp[i][j][1] = dp[i + 1][j][1];
} else if (dp[i + 1][j][0] + w == dp[i][j][0]) {
dp[i][j][1] = (1LL * dp[i][j][1] + dp[i + 1][j][1]) % MOD;
}
}
if (j + 1 <= m - 1 && dp[i][j + 1][0] != -1) {
if (dp[i][j + 1][0] + w > dp[i][j][0]) {
dp[i][j][0] = dp[i][j + 1][0] + w;
dp[i][j][1] = dp[i][j + 1][1];
} else if (dp[i][j + 1][0] + w == dp[i][j][0]) {
dp[i][j][1] = (1LL * dp[i][j][1] + dp[i][j + 1][1]) % MOD;
}
}
}
}
if (dp[0][0][0] == -1) {
return {0, 0};
}
return {dp[0][0][0], dp[0][0][1]};
}
};