- 最大得分的路径数目
给你一个正方形字符数组 board ,你从数组最右下方的字符 ‘S’ 出发。
你的目标是到达数组最左上角的字符 ‘E’ ,数组剩余的部分为数字字符 1, 2, …, 9 或者障碍 ‘X’。在每一步移动中,你可以向上、向左或者左上方移动,可以移动的前提是到达的格子没有障碍。
一条路径的 「得分」 定义为:路径上所有数字的和。
请你返回一个列表,包含两个整数:第一个整数是 「得分」 的最大值,第二个整数是得到最大得分的方案数,请把结果对 10^9 + 7 取余。
如果没有任何路径可以到达终点,请返回 [0, 0] 。
示例 1:
输入:board = [“E23”,“2X2”,“12S”]
输出:[7,1]
示例 2:
输入:board = [“E12”,“1X1”,“21S”]
输出:[4,2]
示例 3:
输入:board = [“E11”,“XXX”,“11S”]
输出:[0,0]
提示:
2 <= board.length == board[i].length <= 100
题解
很裸的一个题目。
AC代码
class Solution {
public:
int score[105][105];
long long num[105][105];
int mod=1000000007;
vector<int> pathsWithMaxScore(vector<string>& board)
{
memset(score,0,sizeof(score));
memset(num,0,sizeof(num));
num[board.size()-1][board.size()-1]=1;
board[0][0]='0';
for(int i=board.size()-1;i>=0;i--)
{
for(int j=board.size()-1;j>=0;j--)
{
if(board[i][j]=='S'||board[i][j]=='X')continue;
if(score[i][j]<score[i][j+1]+(board[i][j]-'0'))
{
score[i][j]=score[i][j+1]+(board[i][j]-'0');
num[i][j]=num[i][j+1];
}
else if(score[i][j]==score[i][j+1]+(board[i][j]-'0'))
{
num[i][j]+=num[i][j+1];
}
if(score[i][j]<score[i+1][j]+(board[i][j]-'0'))
{
score[i][j]=score[i+1][j]+(board[i][j]-'0');
num[i][j]=num[i+1][j];
}
else if(score[i][j]==score[i+1][j]+(board[i][j]-'0'))
{
num[i][j]+=num[i+1][j];
}
if(score[i][j]<score[i+1][j+1]+(board[i][j]-'0'))
{
score[i][j]=score[i+1][j+1]+(board[i][j]-'0');
num[i][j]=num[i+1][j+1];
}
else if(score[i][j]==score[i+1][j+1]+(board[i][j]-'0'))
{
num[i][j]+=num[i+1][j+1];
}
num[i][j]%=mod;
}
}
vector<int>res;
if(num[0][0]==0)
res.push_back(0);
else
res.push_back(score[0][0]);
res.push_back(num[0][0]);
return res;
}
};