Skip to content

Commit fade0fb

Browse files
committedApr 11, 2021
feat: update lcof solutions: No.47. maxValue
剑指 Offer 47. 礼物的最大价值
1 parent 79e0f76 commit fade0fb

File tree

7 files changed

+123
-61
lines changed

7 files changed

+123
-61
lines changed
 

‎README.md

+1
Original file line numberDiff line numberDiff line change
@@ -155,6 +155,7 @@
155155
- [爬楼梯](/solution/0000-0099/0070.Climbing%20Stairs/README.md)
156156
- [接雨水](/solution/0000-0099/0042.Trapping%20Rain%20Water/README.md)
157157
- [最大子序和](/solution/0000-0099/0053.Maximum%20Subarray/README.md)
158+
- [礼物的最大价值](/lcof/面试题47.%20礼物的最大价值/README.md)
158159
- [乘积最大子序列](/solution/0100-0199/0152.Maximum%20Product%20Subarray/README.md)
159160
- [打家劫舍](/solution/0100-0199/0198.House%20Robber/README.md)
160161
- [打家劫舍 II](/solution/0200-0299/0213.House%20Robber%20II/README.md)

‎lcof/面试题47. 礼物的最大价值/README.md

+68-31
Original file line numberDiff line numberDiff line change
@@ -24,51 +24,60 @@
2424

2525
## 解法
2626

27+
动态规划法。
28+
29+
我们假设 `dp[i][j]` 表示走到格子 `(i, j)` 的礼物最大累计价值,则 `dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1]`
30+
2731
<!-- tabs:start -->
2832

2933
### **Python3**
3034

3135
```python
3236
class Solution:
3337
def maxValue(self, grid: List[List[int]]) -> int:
34-
rows, cols = len(grid), len(grid[0])
35-
vals = [[0 for _ in range(cols)] for _ in range(rows)]
36-
vals[0][0] = grid[0][0]
37-
for i in range(1, rows):
38-
vals[i][0] = vals[i - 1][0] + grid[i][0]
39-
for j in range(1, cols):
40-
vals[0][j] = vals[0][j - 1] + grid[0][j]
41-
for i in range(1, rows):
42-
for j in range(1, cols):
43-
vals[i][j] = grid[i][j] + max(vals[i - 1][j], vals[i][j - 1])
44-
return vals[rows - 1][cols - 1]
45-
38+
m, n = len(grid), len(grid[0])
39+
dp = [[0] * (n + 1) for _ in range(m + 1)]
40+
for i in range(1, m + 1):
41+
for j in range(1, n + 1):
42+
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1]
43+
return dp[m][n]
4644
```
4745

4846
### **Java**
4947

5048
```java
5149
class Solution {
5250
public int maxValue(int[][] grid) {
53-
int rows = grid.length, cols = grid[0].length;
54-
int[][] vals = new int[rows][cols];
55-
vals[0][0] = grid[0][0];
56-
for (int i = 1; i < rows; ++i) {
57-
vals[i][0] = vals[i - 1][0] + grid[i][0];
58-
}
59-
for (int j = 1; j < cols; ++j) {
60-
vals[0][j] = vals[0][j - 1] + grid[0][j];
61-
}
62-
for (int i = 1; i < rows; ++i) {
63-
for (int j = 1; j < cols; ++j) {
64-
vals[i][j] = grid[i][j] + Math.max(vals[i - 1][j], vals[i][j - 1]);
51+
int m = grid.length, n = grid[0].length;
52+
int[][] dp = new int[m + 1][n + 1];
53+
for (int i = 1; i <= m; ++i) {
54+
for (int j = 1; j <= n; ++j) {
55+
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
6556
}
6657
}
67-
return vals[rows - 1][cols - 1];
58+
return dp[m][n];
6859
}
6960
}
7061
```
7162

63+
### **C++**
64+
65+
```cpp
66+
class Solution {
67+
public:
68+
int maxValue(vector<vector<int>>& grid) {
69+
int m = grid.size(), n = grid[0].size();
70+
vector<vector<int> > dp(m + 1, vector<int>(n + 1, 0));
71+
for (int i = 1; i < m + 1; ++i) {
72+
for (int j = 1; j < n + 1; ++j) {
73+
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
74+
}
75+
}
76+
return dp[m][n];
77+
}
78+
};
79+
```
80+
7281
### **JavaScript**
7382
7483
```js
@@ -77,18 +86,46 @@ class Solution {
7786
* @return {number}
7887
*/
7988
var maxValue = function (grid) {
80-
let row = grid.length;
81-
let col = grid[0].length;
82-
let dp = [...new Array(row + 1)].map(() => Array(col + 1).fill(0));
83-
for (let i = 1; i <= row; i++) {
84-
for (let j = 1; j <= col; j++) {
89+
const m = grid.length;
90+
const n = grid[0].length;
91+
let dp = new Array(m + 1);
92+
for (let i = 0; i < m + 1; ++i) {
93+
dp[i] = new Array(n + 1).fill(0);
94+
}
95+
for (let i = 1; i < m + 1; ++i) {
96+
for (let j = 1; j < n + 1; ++j) {
8597
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
8698
}
8799
}
88-
return dp[row][col];
100+
return dp[m][n];
89101
};
90102
```
91103

104+
### **Go**
105+
106+
```go
107+
func maxValue(grid [][]int) int {
108+
m, n := len(grid), len(grid[0])
109+
dp := make([][]int, m + 1)
110+
for i := 0; i < m + 1; i++ {
111+
dp[i] = make([]int, n + 1)
112+
}
113+
for i := 1; i < m + 1; i++ {
114+
for j := 1; j < n + 1; j++ {
115+
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1]
116+
}
117+
}
118+
return dp[m][n]
119+
}
120+
121+
func max(a, b int) int {
122+
if (a > b) {
123+
return a
124+
}
125+
return b
126+
}
127+
```
128+
92129
### **...**
93130

94131
```
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
class Solution {
2+
public:
3+
int maxValue(vector<vector<int>>& grid) {
4+
int m = grid.size(), n = grid[0].size();
5+
vector<vector<int> > dp(m + 1, vector<int>(n + 1, 0));
6+
for (int i = 1; i < m + 1; ++i) {
7+
for (int j = 1; j < n + 1; ++j) {
8+
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
9+
}
10+
}
11+
return dp[m][n];
12+
}
13+
};
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
func maxValue(grid [][]int) int {
2+
m, n := len(grid), len(grid[0])
3+
dp := make([][]int, m + 1)
4+
for i := 0; i < m + 1; i++ {
5+
dp[i] = make([]int, n + 1)
6+
}
7+
for i := 1; i < m + 1; i++ {
8+
for j := 1; j < n + 1; j++ {
9+
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1]
10+
}
11+
}
12+
return dp[m][n]
13+
}
14+
15+
func max(a, b int) int {
16+
if (a > b) {
17+
return a
18+
}
19+
return b
20+
}
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,12 @@
11
class Solution {
22
public int maxValue(int[][] grid) {
3-
int rows = grid.length, cols = grid[0].length;
4-
int[][] vals = new int[rows][cols];
5-
vals[0][0] = grid[0][0];
6-
for (int i = 1; i < rows; ++i) {
7-
vals[i][0] = vals[i - 1][0] + grid[i][0];
8-
}
9-
for (int j = 1; j < cols; ++j) {
10-
vals[0][j] = vals[0][j - 1] + grid[0][j];
11-
}
12-
for (int i = 1; i < rows; ++i) {
13-
for (int j = 1; j < cols; ++j) {
14-
vals[i][j] = grid[i][j] + Math.max(vals[i - 1][j], vals[i][j - 1]);
3+
int m = grid.length, n = grid[0].length;
4+
int[][] dp = new int[m + 1][n + 1];
5+
for (int i = 1; i <= m; ++i) {
6+
for (int j = 1; j <= n; ++j) {
7+
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
158
}
169
}
17-
return vals[rows - 1][cols - 1];
10+
return dp[m][n];
1811
}
1912
}

‎lcof/面试题47. 礼物的最大价值/Solution.js

+9-6
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,16 @@
33
* @return {number}
44
*/
55
var maxValue = function (grid) {
6-
let row = grid.length;
7-
let col = grid[0].length;
8-
let dp = [...new Array(row + 1)].map(() => Array(col + 1).fill(0));
9-
for (let i = 1; i <= row; i++) {
10-
for (let j = 1; j <= col; j++) {
6+
const m = grid.length;
7+
const n = grid[0].length;
8+
let dp = new Array(m + 1);
9+
for (let i = 0; i < m + 1; ++i) {
10+
dp[i] = new Array(n + 1).fill(0);
11+
}
12+
for (let i = 1; i < m + 1; ++i) {
13+
for (let j = 1; j < n + 1; ++j) {
1114
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
1215
}
1316
}
14-
return dp[row][col];
17+
return dp[m][n];
1518
};
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
11
class Solution:
22
def maxValue(self, grid: List[List[int]]) -> int:
3-
rows, cols = len(grid), len(grid[0])
4-
vals = [[0 for _ in range(cols)] for _ in range(rows)]
5-
vals[0][0] = grid[0][0]
6-
for i in range(1, rows):
7-
vals[i][0] = vals[i - 1][0] + grid[i][0]
8-
for j in range(1, cols):
9-
vals[0][j] = vals[0][j - 1] + grid[0][j]
10-
for i in range(1, rows):
11-
for j in range(1, cols):
12-
vals[i][j] = grid[i][j] + max(vals[i - 1][j], vals[i][j - 1])
13-
return vals[rows - 1][cols - 1]
3+
m, n = len(grid), len(grid[0])
4+
dp = [[0] * (n + 1) for _ in range(m + 1)]
5+
for i in range(1, m + 1):
6+
for j in range(1, n + 1):
7+
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1]
8+
return dp[m][n]

0 commit comments

Comments
 (0)