Skip to content

Commit dfc755c

Browse files
committed
feat: add solutions to lc problem: No.2304
No.2304.Minimum Path Cost in a Grid
1 parent c90cd44 commit dfc755c

File tree

6 files changed

+105
-151
lines changed

6 files changed

+105
-151
lines changed

solution/2300-2399/2304.Minimum Path Cost in a Grid/README.md

Lines changed: 45 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,21 @@
5757

5858
<!-- 这里可写通用的实现逻辑 -->
5959

60-
**方法一:递推**
60+
**方法一:动态规划**
61+
62+
我们定义 $f[i][j]$ 表示从第一行出发,到达第 $i$ 行第 $j$ 列的最小路径代价。由于每次只能从上一行的某一列移动到当前行的某一列,因此 $f[i][j]$ 的值可以从 $f[i - 1][k]$ 转移而来,其中 $k$ 的取值范围为 $[0, n - 1]$。因此状态转移方程为:
63+
64+
$$
65+
f[i][j] = \min_{0 \leq k < n} \{f[i - 1][k] + \text{moveCost}[grid[i - 1][k]][j] + grid[i][j]\}
66+
$$
67+
68+
其中 $\text{moveCost}[grid[i - 1][k]][j]$ 表示从第 $i - 1$ 行第 $k$ 列移动到第 $i$ 行第 $j$ 列的代价。
69+
70+
最终答案即为 $f[m - 1][j]$ 的最小值,其中 $j$ 的取值范围为 $[0, n - 1]$。
71+
72+
由于每次转移只需要用到上一行的状态,因此可以将空间复杂度优化到 $O(n)$。
73+
74+
时间复杂度 $O(m \times n^2)$,空间复杂度 $O(n)$。其中 $m$ 和 $n$ 分别为网格的行数和列数。
6175

6276
<!-- tabs:start -->
6377

@@ -68,18 +82,13 @@
6882
```python
6983
class Solution:
7084
def minPathCost(self, grid: List[List[int]], moveCost: List[List[int]]) -> int:
71-
n = len(grid[0])
72-
f = [0] * n
73-
for i, row in enumerate(grid):
74-
g = [0] * n
75-
for j, v in enumerate(row):
76-
g[j] = v
77-
t = inf
78-
if i:
79-
for k, x in enumerate(grid[i - 1]):
80-
t = min(t, f[k] + moveCost[x][j])
81-
if t != inf:
82-
g[j] += t
85+
m, n = len(grid), len(grid[0])
86+
f = grid[0]
87+
for i in range(1, m):
88+
g = [inf] * n
89+
for j in range(n):
90+
for k in range(n):
91+
g[j] = min(g[j], f[k] + moveCost[grid[i - 1][k]][j] + grid[i][j])
8392
f = g
8493
return min(f)
8594
```
@@ -92,24 +101,20 @@ class Solution:
92101
class Solution {
93102
public int minPathCost(int[][] grid, int[][] moveCost) {
94103
int m = grid.length, n = grid[0].length;
95-
int inf = Integer.MAX_VALUE;
96-
int[] f = new int[n];
97-
for (int i = 0; i < m; ++i) {
104+
int[] f = grid[0];
105+
final int inf = 1 << 30;
106+
for (int i = 1; i < m; ++i) {
98107
int[] g = new int[n];
108+
Arrays.fill(g, inf);
99109
for (int j = 0; j < n; ++j) {
100-
g[j] = grid[i][j];
101-
int t = inf;
102-
if (i > 0) {
103-
for (int k = 0; k < n; ++k) {
104-
t = Math.min(t, f[k] + moveCost[grid[i - 1][k]][j]);
105-
}
106-
}
107-
if (t != inf) {
108-
g[j] += t;
110+
for (int k = 0; k < n; ++k) {
111+
g[j] = Math.min(g[j], f[k] + moveCost[grid[i - 1][k]][j] + grid[i][j]);
109112
}
110113
}
111114
f = g;
112115
}
116+
117+
// return Arrays.stream(f).min().getAsInt();
113118
int ans = inf;
114119
for (int v : f) {
115120
ans = Math.min(ans, v);
@@ -126,21 +131,16 @@ class Solution {
126131
public:
127132
int minPathCost(vector<vector<int>>& grid, vector<vector<int>>& moveCost) {
128133
int m = grid.size(), n = grid[0].size();
129-
int inf = INT_MAX;
130-
vector<int> f(n);
131-
for (int i = 0; i < m; ++i) {
132-
vector<int> g(n);
134+
const int inf = 1 << 30;
135+
vector<int> f = grid[0];
136+
for (int i = 1; i < m; ++i) {
137+
vector<int> g(n, inf);
133138
for (int j = 0; j < n; ++j) {
134-
g[j] = grid[i][j];
135-
int t = inf;
136-
if (i) {
137-
for (int k = 0; k < n; ++k) {
138-
t = min(t, f[k] + moveCost[grid[i - 1][k]][j]);
139-
}
139+
for (int k = 0; k < n; ++k) {
140+
g[j] = min(g[j], f[k] + moveCost[grid[i - 1][k]][j] + grid[i][j]);
140141
}
141-
if (t != inf) g[j] += t;
142142
}
143-
f = g;
143+
f = move(g);
144144
}
145145
return *min_element(f.begin(), f.end());
146146
}
@@ -151,21 +151,15 @@ public:
151151
152152
```go
153153
func minPathCost(grid [][]int, moveCost [][]int) int {
154-
n := len(grid[0])
155-
inf := 0x3f3f3f3f
156-
f := make([]int, n)
157-
for i, row := range grid {
154+
m, n := len(grid), len(grid[0])
155+
const inf = 1 << 30
156+
f := grid[0]
157+
for i := 1; i < m; i++ {
158158
g := make([]int, n)
159-
for j, v := range row {
160-
g[j] = v
161-
t := inf
162-
if i > 0 {
163-
for k := 0; k < n; k++ {
164-
t = min(t, f[k]+moveCost[grid[i-1][k]][j])
165-
}
166-
}
167-
if t != inf {
168-
g[j] += t
159+
for j := 0; j < n; j++ {
160+
g[j] = inf
161+
for k := 0; k < n; k++ {
162+
g[j] = min(g[j], f[k]+moveCost[grid[i-1][k]][j]+grid[i][j])
169163
}
170164
}
171165
f = g

solution/2300-2399/2304.Minimum Path Cost in a Grid/README_EN.md

Lines changed: 30 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -56,18 +56,13 @@ So the total cost of this path is 5 + 1 = 6.
5656
```python
5757
class Solution:
5858
def minPathCost(self, grid: List[List[int]], moveCost: List[List[int]]) -> int:
59-
n = len(grid[0])
60-
f = [0] * n
61-
for i, row in enumerate(grid):
62-
g = [0] * n
63-
for j, v in enumerate(row):
64-
g[j] = v
65-
t = inf
66-
if i:
67-
for k, x in enumerate(grid[i - 1]):
68-
t = min(t, f[k] + moveCost[x][j])
69-
if t != inf:
70-
g[j] += t
59+
m, n = len(grid), len(grid[0])
60+
f = grid[0]
61+
for i in range(1, m):
62+
g = [inf] * n
63+
for j in range(n):
64+
for k in range(n):
65+
g[j] = min(g[j], f[k] + moveCost[grid[i - 1][k]][j] + grid[i][j])
7166
f = g
7267
return min(f)
7368
```
@@ -78,24 +73,20 @@ class Solution:
7873
class Solution {
7974
public int minPathCost(int[][] grid, int[][] moveCost) {
8075
int m = grid.length, n = grid[0].length;
81-
int inf = Integer.MAX_VALUE;
82-
int[] f = new int[n];
83-
for (int i = 0; i < m; ++i) {
76+
int[] f = grid[0];
77+
final int inf = 1 << 30;
78+
for (int i = 1; i < m; ++i) {
8479
int[] g = new int[n];
80+
Arrays.fill(g, inf);
8581
for (int j = 0; j < n; ++j) {
86-
g[j] = grid[i][j];
87-
int t = inf;
88-
if (i > 0) {
89-
for (int k = 0; k < n; ++k) {
90-
t = Math.min(t, f[k] + moveCost[grid[i - 1][k]][j]);
91-
}
92-
}
93-
if (t != inf) {
94-
g[j] += t;
82+
for (int k = 0; k < n; ++k) {
83+
g[j] = Math.min(g[j], f[k] + moveCost[grid[i - 1][k]][j] + grid[i][j]);
9584
}
9685
}
9786
f = g;
9887
}
88+
89+
// return Arrays.stream(f).min().getAsInt();
9990
int ans = inf;
10091
for (int v : f) {
10192
ans = Math.min(ans, v);
@@ -112,21 +103,16 @@ class Solution {
112103
public:
113104
int minPathCost(vector<vector<int>>& grid, vector<vector<int>>& moveCost) {
114105
int m = grid.size(), n = grid[0].size();
115-
int inf = INT_MAX;
116-
vector<int> f(n);
117-
for (int i = 0; i < m; ++i) {
118-
vector<int> g(n);
106+
const int inf = 1 << 30;
107+
vector<int> f = grid[0];
108+
for (int i = 1; i < m; ++i) {
109+
vector<int> g(n, inf);
119110
for (int j = 0; j < n; ++j) {
120-
g[j] = grid[i][j];
121-
int t = inf;
122-
if (i) {
123-
for (int k = 0; k < n; ++k) {
124-
t = min(t, f[k] + moveCost[grid[i - 1][k]][j]);
125-
}
111+
for (int k = 0; k < n; ++k) {
112+
g[j] = min(g[j], f[k] + moveCost[grid[i - 1][k]][j] + grid[i][j]);
126113
}
127-
if (t != inf) g[j] += t;
128114
}
129-
f = g;
115+
f = move(g);
130116
}
131117
return *min_element(f.begin(), f.end());
132118
}
@@ -137,21 +123,15 @@ public:
137123
138124
```go
139125
func minPathCost(grid [][]int, moveCost [][]int) int {
140-
n := len(grid[0])
141-
inf := 0x3f3f3f3f
142-
f := make([]int, n)
143-
for i, row := range grid {
126+
m, n := len(grid), len(grid[0])
127+
const inf = 1 << 30
128+
f := grid[0]
129+
for i := 1; i < m; i++ {
144130
g := make([]int, n)
145-
for j, v := range row {
146-
g[j] = v
147-
t := inf
148-
if i > 0 {
149-
for k := 0; k < n; k++ {
150-
t = min(t, f[k]+moveCost[grid[i-1][k]][j])
151-
}
152-
}
153-
if t != inf {
154-
g[j] += t
131+
for j := 0; j < n; j++ {
132+
g[j] = inf
133+
for k := 0; k < n; k++ {
134+
g[j] = min(g[j], f[k]+moveCost[grid[i-1][k]][j]+grid[i][j])
155135
}
156136
}
157137
f = g

solution/2300-2399/2304.Minimum Path Cost in a Grid/Solution.cpp

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,16 @@ class Solution {
22
public:
33
int minPathCost(vector<vector<int>>& grid, vector<vector<int>>& moveCost) {
44
int m = grid.size(), n = grid[0].size();
5-
int inf = INT_MAX;
6-
vector<int> f(n);
7-
for (int i = 0; i < m; ++i) {
8-
vector<int> g(n);
5+
const int inf = 1 << 30;
6+
vector<int> f = grid[0];
7+
for (int i = 1; i < m; ++i) {
8+
vector<int> g(n, inf);
99
for (int j = 0; j < n; ++j) {
10-
g[j] = grid[i][j];
11-
int t = inf;
12-
if (i) {
13-
for (int k = 0; k < n; ++k) {
14-
t = min(t, f[k] + moveCost[grid[i - 1][k]][j]);
15-
}
10+
for (int k = 0; k < n; ++k) {
11+
g[j] = min(g[j], f[k] + moveCost[grid[i - 1][k]][j] + grid[i][j]);
1612
}
17-
if (t != inf) g[j] += t;
1813
}
19-
f = g;
14+
f = move(g);
2015
}
2116
return *min_element(f.begin(), f.end());
2217
}

solution/2300-2399/2304.Minimum Path Cost in a Grid/Solution.go

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,13 @@
11
func minPathCost(grid [][]int, moveCost [][]int) int {
2-
n := len(grid[0])
3-
inf := 0x3f3f3f3f
4-
f := make([]int, n)
5-
for i, row := range grid {
2+
m, n := len(grid), len(grid[0])
3+
const inf = 1 << 30
4+
f := grid[0]
5+
for i := 1; i < m; i++ {
66
g := make([]int, n)
7-
for j, v := range row {
8-
g[j] = v
9-
t := inf
10-
if i > 0 {
11-
for k := 0; k < n; k++ {
12-
t = min(t, f[k]+moveCost[grid[i-1][k]][j])
13-
}
14-
}
15-
if t != inf {
16-
g[j] += t
7+
for j := 0; j < n; j++ {
8+
g[j] = inf
9+
for k := 0; k < n; k++ {
10+
g[j] = min(g[j], f[k]+moveCost[grid[i-1][k]][j]+grid[i][j])
1711
}
1812
}
1913
f = g

solution/2300-2399/2304.Minimum Path Cost in a Grid/Solution.java

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,20 @@
11
class Solution {
22
public int minPathCost(int[][] grid, int[][] moveCost) {
33
int m = grid.length, n = grid[0].length;
4-
int inf = Integer.MAX_VALUE;
5-
int[] f = new int[n];
6-
for (int i = 0; i < m; ++i) {
4+
int[] f = grid[0];
5+
final int inf = 1 << 30;
6+
for (int i = 1; i < m; ++i) {
77
int[] g = new int[n];
8+
Arrays.fill(g, inf);
89
for (int j = 0; j < n; ++j) {
9-
g[j] = grid[i][j];
10-
int t = inf;
11-
if (i > 0) {
12-
for (int k = 0; k < n; ++k) {
13-
t = Math.min(t, f[k] + moveCost[grid[i - 1][k]][j]);
14-
}
15-
}
16-
if (t != inf) {
17-
g[j] += t;
10+
for (int k = 0; k < n; ++k) {
11+
g[j] = Math.min(g[j], f[k] + moveCost[grid[i - 1][k]][j] + grid[i][j]);
1812
}
1913
}
2014
f = g;
2115
}
16+
17+
// return Arrays.stream(f).min().getAsInt();
2218
int ans = inf;
2319
for (int v : f) {
2420
ans = Math.min(ans, v);
Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,11 @@
11
class Solution:
22
def minPathCost(self, grid: List[List[int]], moveCost: List[List[int]]) -> int:
3-
n = len(grid[0])
4-
f = [0] * n
5-
for i, row in enumerate(grid):
6-
g = [0] * n
7-
for j, v in enumerate(row):
8-
g[j] = v
9-
t = inf
10-
if i:
11-
for k, x in enumerate(grid[i - 1]):
12-
t = min(t, f[k] + moveCost[x][j])
13-
if t != inf:
14-
g[j] += t
3+
m, n = len(grid), len(grid[0])
4+
f = grid[0]
5+
for i in range(1, m):
6+
g = [inf] * n
7+
for j in range(n):
8+
for k in range(n):
9+
g[j] = min(g[j], f[k] + moveCost[grid[i - 1][k]][j] + grid[i][j])
1510
f = g
1611
return min(f)

0 commit comments

Comments
 (0)