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
3236class 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
5149class 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 */
7988var 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```
0 commit comments