24
24
25
25
## 解法
26
26
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
+
27
31
<!-- tabs:start -->
28
32
29
33
### ** Python3**
30
34
31
35
``` python
32
36
class Solution :
33
37
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]
46
44
```
47
45
48
46
### ** Java**
49
47
50
48
``` java
51
49
class Solution {
52
50
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 ];
65
56
}
66
57
}
67
- return vals[rows - 1 ][cols - 1 ];
58
+ return dp[m][n ];
68
59
}
69
60
}
70
61
```
71
62
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
+
72
81
### **JavaScript**
73
82
74
83
```js
@@ -77,18 +86,46 @@ class Solution {
77
86
* @return {number}
78
87
*/
79
88
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) {
85
97
dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]) + grid[i - 1][j - 1];
86
98
}
87
99
}
88
- return dp[row][col ];
100
+ return dp[m][n ];
89
101
};
90
102
```
91
103
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
+
92
129
### ** ...**
93
130
94
131
```
0 commit comments