解题思路:
ds表示矩阵每个位置的得分,dp表示每个位置的路径条数
(1)ds[i][j] = max{ds[i+1][j],ds[i][j+1],ds[i+1][j+1]}+board[i][j]-'0',注意board[i][j]不为'X',若为'S','E'可视为'0'
(2)dp[i][j] = {dp[i+1][j],dp[i][j+1],dp[i+1][j+1]}对应的{ds[i+1][j],ds[i][j+1],ds[i+1][j+1]}最大值对应的和。
例如{ds[i+1][j],ds[i][j+1],ds[i+1][j+1]} = [12,12,3],那么dp[i][j]=dp[i+1][j]+dp[i][j+1],注意每次结果都需要取模10^9 + 7
class Solution {
public:
vector<int> pathsWithMaxScore(vector<string>& board) {
int dp[100][100] = {0};
int ds[100][100] = {0}; // 路径和分数
int a,b,c;
int length = board.size();
ds[length-1][length-1] = 1;
dp[length-1][length-1] = 1;
board[length-1][length-1] = '0';
board[0][0] = '0';
for (int i=length-1;i>=0;i--) {
for (int j=length-1;j>=0;j--) {
if (board[i][j]!='X') { //等于'X'直接跳过
if (i+1<length) { //判断下方是否越界
if (j+1<length) { //判断右方是否越界
a = ds[i+1][j];
b = ds[i][j+1];
c = ds[i+1][j+1];
if (a>b) { //a>b
if (a>c) {
ds[i][j] = a + (board[i][j]-'0');
dp[i][j] = dp[i+1][j] % 1000000007;
} else {
if (a == c) {
ds[i][j] = a + (board[i][j]-'0');
dp[i][j] = (dp[i+1][j]+dp[i+1][j+1]) % 1000000007;
} else {
ds[i][j] = c + (board[i][j]-'0');
dp[i][j] = dp[i+1][j+1] % 1000000007;
}
}
} else {
if (a<b) { // a<b
if (b>c) {
ds[i][j] = b + (board[i][j]-'0');
dp[i][j] = dp[i][j+1] % 1000000007;
} else {
if (b == c) {
ds[i][j] = b + (board[i][j]-'0');
dp[i][j] = (dp[i][j+1]+dp[i+1][j+1]) % 1000000007;
} else {
ds[i][j] = c + (board[i][j]-'0');
dp[i][j] = dp[i+1][j+1] % 1000000007;
}
}
} else { //a == b
if (a>c) {
ds[i][j] = a + (board[i][j]-'0');
dp[i][j] = (dp[i+1][j]+dp[i][j+1]) % 1000000007;
} else {
if (a == c && a!=0) {
ds[i][j] = a + (board[i][j]-'0');
dp[i][j] = (dp[i+1][j]+dp[i][j+1]+dp[i+1][j+1]) % 1000000007;
} else {
if (a<c) {
ds[i][j] = c + (board[i][j]-'0');
dp[i][j] = dp[i+1][j+1] % 1000000007;
} //a==0 a==b==c
}
}
}
}
} else { //只有从下方来
a = ds[i+1][j];
if (a!=0) {
ds[i][j] = a + (board[i][j]-'0');
dp[i][j] = dp[i+1][j] % 1000000007;
}
}
} else { //只有从右边来
if (j!=length-1) {
b = ds[i][j+1];
if (b!=0) {
ds[i][j] = b + (board[i][j]-'0');
dp[i][j] = dp[i][j+1] % 1000000007;
}
}
}
}
}
}
/*
for (int i=0;i<length;i++) {
for (int j=0;j<length;j++) {
cout<<ds[i][j]<<" ";
}
cout<<endl;
}
for (int i=0;i<length;i++) {
for (int j=0;j<length;j++) {
cout<<dp[i][j]<<" ";
}
cout<<endl;
}
*/
vector<int> v;
v.push_back(ds[0][0]==0?0:ds[0][0]-1);
v.push_back(dp[0][0]);
return v;
}
};