Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

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)

AltStyle によって変換されたページ (->オリジナル) /