Skip to content

Commit 8a7169d

Browse files
committed
feat: add solutions to lc problem: No.1301
No.1301.Number of Paths with Max Score
1 parent 6e344cb commit 8a7169d

File tree

6 files changed

+508
-4
lines changed

6 files changed

+508
-4
lines changed

solution/1300-1399/1301.Number of Paths with Max Score/README.md

Lines changed: 179 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,22 +51,200 @@
5151

5252
<!-- 这里可写通用的实现逻辑 -->
5353

54+
**方法一:动态规划**
55+
56+
我们定义 $f[i][j]$ 表示从起点 $(n - 1, n - 1)$ 到达 $(i, j)$ 的最大得分,定义 $g[i][j]$ 表示从起点 $(n - 1, n - 1)$ 到达 $(i, j)$ 的最大得分的方案数。初始时 $f[n - 1][n - 1] = 0$,并且 $g[n - 1][n - 1] = 1$。其它位置的 $f[i][j]$ 均为 $-1$,而 $g[i][j]$ 均为 $0$。
57+
58+
对于当前位置 $(i, j)$,它可以由 $(i + 1, j)$, $(i, j + 1)$, $(i + 1, j + 1)$ 三个位置转移而来,因此我们可以枚举这三个位置,更新 $f[i][j]$ 和 $g[i][j]$ 的值。如果当前位置 $(i, j)$ 有障碍,或者当前位置是起点,或者其它位置越界,则不进行更新。否则,如果其它位置 $(x, y)$ 满足 $f[x][y] \gt f[i][j]$,那么我们更新 $f[i][j] = f[x][y]$,并且 $g[i][j] = g[x][y]$。如果 $f[x][y] = f[i][j]$,那么我们更新 $g[i][j] = g[i][j] + g[x][y]$。最后,如果当前位置 $(i, j)$ 可达并且是数字,我们更新 $f[i][j] = f[i][j] + board[i][j]$。
59+
60+
最后,如果 $f[0][0] \lt 0$,说明没有路径可以到达终点,返回 $[0, 0]$。否则,返回 $[f[0][0], g[0][0]]$。注意,返回结果需要对 $10^9 + 7$ 取余。
61+
62+
时间复杂度 $O(n^2)$,空间复杂度 $O(n^2)$。其中 $n$ 是数组的边长。
63+
5464
<!-- tabs:start -->
5565

5666
### **Python3**
5767

5868
<!-- 这里可写当前语言的特殊实现逻辑 -->
5969

6070
```python
61-
71+
class Solution:
72+
def pathsWithMaxScore(self, board: List[str]) -> List[int]:
73+
def update(i, j, x, y):
74+
if x >= n or y >= n or f[x][y] == -1 or board[i][j] in "XS":
75+
return
76+
if f[x][y] > f[i][j]:
77+
f[i][j] = f[x][y]
78+
g[i][j] = g[x][y]
79+
elif f[x][y] == f[i][j]:
80+
g[i][j] += g[x][y]
81+
82+
n = len(board)
83+
f = [[-1] * n for _ in range(n)]
84+
g = [[0] * n for _ in range(n)]
85+
f[-1][-1], g[-1][-1] = 0, 1
86+
for i in range(n - 1, -1, -1):
87+
for j in range(n - 1, -1, -1):
88+
update(i, j, i + 1, j)
89+
update(i, j, i, j + 1)
90+
update(i, j, i + 1, j + 1)
91+
if f[i][j] != -1 and board[i][j].isdigit():
92+
f[i][j] += int(board[i][j])
93+
mod = 10**9 + 7
94+
return [0, 0] if f[0][0] == -1 else [f[0][0], g[0][0] % mod]
6295
```
6396

6497
### **Java**
6598

6699
<!-- 这里可写当前语言的特殊实现逻辑 -->
67100

68101
```java
102+
class Solution {
103+
private List<String> board;
104+
private int n;
105+
private int[][] f;
106+
private int[][] g;
107+
private final int mod = (int) 1e9 + 7;
108+
109+
public int[] pathsWithMaxScore(List<String> board) {
110+
n = board.size();
111+
this.board = board;
112+
f = new int[n][n];
113+
g = new int[n][n];
114+
for (var e : f) {
115+
Arrays.fill(e, -1);
116+
}
117+
f[n - 1][n - 1] = 0;
118+
g[n - 1][n - 1] = 1;
119+
for (int i = n - 1; i >= 0; --i) {
120+
for (int j = n - 1; j >= 0; --j) {
121+
update(i, j, i + 1, j);
122+
update(i, j, i, j + 1);
123+
update(i, j, i + 1, j + 1);
124+
if (f[i][j] != -1) {
125+
char c = board.get(i).charAt(j);
126+
if (c >= '0' && c <= '9') {
127+
f[i][j] += (c - '0');
128+
}
129+
}
130+
}
131+
}
132+
int[] ans = new int[2];
133+
if (f[0][0] != -1) {
134+
ans[0] = f[0][0];
135+
ans[1] = g[0][0];
136+
}
137+
return ans;
138+
}
139+
140+
private void update(int i, int j, int x, int y) {
141+
if (x >= n || y >= n || f[x][y] == -1 || board.get(i).charAt(j) == 'X' || board.get(i).charAt(j) == 'S') {
142+
return;
143+
}
144+
if (f[x][y] > f[i][j]) {
145+
f[i][j] = f[x][y];
146+
g[i][j] = g[x][y];
147+
} else if (f[x][y] == f[i][j]) {
148+
g[i][j] = (g[i][j] + g[x][y]) % mod;
149+
}
150+
}
151+
}
152+
```
153+
154+
### **C++**
155+
156+
```cpp
157+
class Solution {
158+
public:
159+
vector<int> pathsWithMaxScore(vector<string>& board) {
160+
int n = board.size();
161+
const int mod = 1e9 + 7;
162+
int f[n][n];
163+
int g[n][n];
164+
memset(f, -1, sizeof(f));
165+
memset(g, 0, sizeof(g));
166+
f[n - 1][n - 1] = 0;
167+
g[n - 1][n - 1] = 1;
168+
169+
auto update = [&](int i, int j, int x, int y) {
170+
if (x >= n || y >= n || f[x][y] == -1 || board[i][j] == 'X' || board[i][j] == 'S') {
171+
return;
172+
}
173+
if (f[x][y] > f[i][j]) {
174+
f[i][j] = f[x][y];
175+
g[i][j] = g[x][y];
176+
} else if (f[x][y] == f[i][j]) {
177+
g[i][j] = (g[i][j] + g[x][y]) % mod;
178+
}
179+
};
180+
181+
for (int i = n - 1; i >= 0; --i) {
182+
for (int j = n - 1; j >= 0; --j) {
183+
update(i, j, i + 1, j);
184+
update(i, j, i, j + 1);
185+
update(i, j, i + 1, j + 1);
186+
if (f[i][j] != -1) {
187+
if (board[i][j] >= '0' && board[i][j] <= '9') {
188+
f[i][j] += (board[i][j] - '0');
189+
}
190+
}
191+
}
192+
}
193+
vector<int> ans(2);
194+
if (f[0][0] != -1) {
195+
ans[0] = f[0][0];
196+
ans[1] = g[0][0];
197+
}
198+
return ans;
199+
}
200+
};
201+
```
69202

203+
### **Go**
204+
205+
```go
206+
func pathsWithMaxScore(board []string) []int {
207+
n := len(board)
208+
f := make([][]int, n)
209+
g := make([][]int, n)
210+
for i := range f {
211+
f[i] = make([]int, n)
212+
g[i] = make([]int, n)
213+
for j := range f[i] {
214+
f[i][j] = -1
215+
}
216+
}
217+
f[n-1][n-1] = 0
218+
g[n-1][n-1] = 1
219+
const mod = 1e9 + 7
220+
221+
update := func(i, j, x, y int) {
222+
if x >= n || y >= n || f[x][y] == -1 || board[i][j] == 'X' || board[i][j] == 'S' {
223+
return
224+
}
225+
if f[x][y] > f[i][j] {
226+
f[i][j] = f[x][y]
227+
g[i][j] = g[x][y]
228+
} else if f[x][y] == f[i][j] {
229+
g[i][j] = (g[i][j] + g[x][y]) % mod
230+
}
231+
}
232+
for i := n - 1; i >= 0; i-- {
233+
for j := n - 1; j >= 0; j-- {
234+
update(i, j, i+1, j)
235+
update(i, j, i, j+1)
236+
update(i, j, i+1, j+1)
237+
if f[i][j] != -1 && board[i][j] >= '0' && board[i][j] <= '9' {
238+
f[i][j] += int(board[i][j] - '0')
239+
}
240+
}
241+
}
242+
ans := make([]int, 2)
243+
if f[0][0] != -1 {
244+
ans[0], ans[1] = f[0][0], g[0][0]
245+
}
246+
return ans
247+
}
70248
```
71249

72250
### **...**

solution/1300-1399/1301.Number of Paths with Max Score/README_EN.md

Lines changed: 169 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,7 @@
3939
<p><strong>Constraints:</strong></p>
4040

4141
<ul>
42-
4342
<li><code>2 &lt;= board.length == board[i].length &lt;= 100</code></li>
44-
4543
</ul>
4644

4745
## Solutions
@@ -51,13 +49,181 @@
5149
### **Python3**
5250

5351
```python
54-
52+
class Solution:
53+
def pathsWithMaxScore(self, board: List[str]) -> List[int]:
54+
def update(i, j, x, y):
55+
if x >= n or y >= n or f[x][y] == -1 or board[i][j] in "XS":
56+
return
57+
if f[x][y] > f[i][j]:
58+
f[i][j] = f[x][y]
59+
g[i][j] = g[x][y]
60+
elif f[x][y] == f[i][j]:
61+
g[i][j] += g[x][y]
62+
63+
n = len(board)
64+
f = [[-1] * n for _ in range(n)]
65+
g = [[0] * n for _ in range(n)]
66+
f[-1][-1], g[-1][-1] = 0, 1
67+
for i in range(n - 1, -1, -1):
68+
for j in range(n - 1, -1, -1):
69+
update(i, j, i + 1, j)
70+
update(i, j, i, j + 1)
71+
update(i, j, i + 1, j + 1)
72+
if f[i][j] != -1 and board[i][j].isdigit():
73+
f[i][j] += int(board[i][j])
74+
mod = 10**9 + 7
75+
return [0, 0] if f[0][0] == -1 else [f[0][0], g[0][0] % mod]
5576
```
5677

5778
### **Java**
5879

5980
```java
81+
class Solution {
82+
private List<String> board;
83+
private int n;
84+
private int[][] f;
85+
private int[][] g;
86+
private final int mod = (int) 1e9 + 7;
87+
88+
public int[] pathsWithMaxScore(List<String> board) {
89+
n = board.size();
90+
this.board = board;
91+
f = new int[n][n];
92+
g = new int[n][n];
93+
for (var e : f) {
94+
Arrays.fill(e, -1);
95+
}
96+
f[n - 1][n - 1] = 0;
97+
g[n - 1][n - 1] = 1;
98+
for (int i = n - 1; i >= 0; --i) {
99+
for (int j = n - 1; j >= 0; --j) {
100+
update(i, j, i + 1, j);
101+
update(i, j, i, j + 1);
102+
update(i, j, i + 1, j + 1);
103+
if (f[i][j] != -1) {
104+
char c = board.get(i).charAt(j);
105+
if (c >= '0' && c <= '9') {
106+
f[i][j] += (c - '0');
107+
}
108+
}
109+
}
110+
}
111+
int[] ans = new int[2];
112+
if (f[0][0] != -1) {
113+
ans[0] = f[0][0];
114+
ans[1] = g[0][0];
115+
}
116+
return ans;
117+
}
118+
119+
private void update(int i, int j, int x, int y) {
120+
if (x >= n || y >= n || f[x][y] == -1 || board.get(i).charAt(j) == 'X' || board.get(i).charAt(j) == 'S') {
121+
return;
122+
}
123+
if (f[x][y] > f[i][j]) {
124+
f[i][j] = f[x][y];
125+
g[i][j] = g[x][y];
126+
} else if (f[x][y] == f[i][j]) {
127+
g[i][j] = (g[i][j] + g[x][y]) % mod;
128+
}
129+
}
130+
}
131+
```
132+
133+
### **C++**
134+
135+
```cpp
136+
class Solution {
137+
public:
138+
vector<int> pathsWithMaxScore(vector<string>& board) {
139+
int n = board.size();
140+
const int mod = 1e9 + 7;
141+
int f[n][n];
142+
int g[n][n];
143+
memset(f, -1, sizeof(f));
144+
memset(g, 0, sizeof(g));
145+
f[n - 1][n - 1] = 0;
146+
g[n - 1][n - 1] = 1;
147+
148+
auto update = [&](int i, int j, int x, int y) {
149+
if (x >= n || y >= n || f[x][y] == -1 || board[i][j] == 'X' || board[i][j] == 'S') {
150+
return;
151+
}
152+
if (f[x][y] > f[i][j]) {
153+
f[i][j] = f[x][y];
154+
g[i][j] = g[x][y];
155+
} else if (f[x][y] == f[i][j]) {
156+
g[i][j] = (g[i][j] + g[x][y]) % mod;
157+
}
158+
};
159+
160+
for (int i = n - 1; i >= 0; --i) {
161+
for (int j = n - 1; j >= 0; --j) {
162+
update(i, j, i + 1, j);
163+
update(i, j, i, j + 1);
164+
update(i, j, i + 1, j + 1);
165+
if (f[i][j] != -1) {
166+
if (board[i][j] >= '0' && board[i][j] <= '9') {
167+
f[i][j] += (board[i][j] - '0');
168+
}
169+
}
170+
}
171+
}
172+
vector<int> ans(2);
173+
if (f[0][0] != -1) {
174+
ans[0] = f[0][0];
175+
ans[1] = g[0][0];
176+
}
177+
return ans;
178+
}
179+
};
180+
```
60181

182+
### **Go**
183+
184+
```go
185+
func pathsWithMaxScore(board []string) []int {
186+
n := len(board)
187+
f := make([][]int, n)
188+
g := make([][]int, n)
189+
for i := range f {
190+
f[i] = make([]int, n)
191+
g[i] = make([]int, n)
192+
for j := range f[i] {
193+
f[i][j] = -1
194+
}
195+
}
196+
f[n-1][n-1] = 0
197+
g[n-1][n-1] = 1
198+
const mod = 1e9 + 7
199+
200+
update := func(i, j, x, y int) {
201+
if x >= n || y >= n || f[x][y] == -1 || board[i][j] == 'X' || board[i][j] == 'S' {
202+
return
203+
}
204+
if f[x][y] > f[i][j] {
205+
f[i][j] = f[x][y]
206+
g[i][j] = g[x][y]
207+
} else if f[x][y] == f[i][j] {
208+
g[i][j] = (g[i][j] + g[x][y]) % mod
209+
}
210+
}
211+
for i := n - 1; i >= 0; i-- {
212+
for j := n - 1; j >= 0; j-- {
213+
update(i, j, i+1, j)
214+
update(i, j, i, j+1)
215+
update(i, j, i+1, j+1)
216+
if f[i][j] != -1 && board[i][j] >= '0' && board[i][j] <= '9' {
217+
f[i][j] += int(board[i][j] - '0')
218+
}
219+
}
220+
}
221+
ans := make([]int, 2)
222+
if f[0][0] != -1 {
223+
ans[0], ans[1] = f[0][0], g[0][0]
224+
}
225+
return ans
226+
}
61227
```
62228

63229
### **...**

0 commit comments

Comments
 (0)