@@ -18,34 +18,33 @@ class Solution {
18
18
vector<vector<int >> f (
19
19
n, vector<int >(n, INT_MIN)); // f 表示俩人摘到的樱桃个数之和的最大值
20
20
f[0 ][0 ] = grid[0 ][0 ];
21
- for (int k = 1 ; k < n * 2 - 1 ; ++k) // k为两人步数之和,x为向右走的步数,y为向下走的步数。
22
- // x_1+y_1 = x_2+y_2 = k
23
- {
24
- for (int x1 = min (k, n - 1 ); x1 >= max (k - n + 1 , 0 ); --x1) {
25
- for (int x2 = min (k, n - 1 ); x2 >= x1; --x2) {
26
- int y1 = k - x1, y2 = k - x2;
27
- if (grid[x1][y1 ] == -1 || grid[x2][y2] == -1 ) {
28
- f[x1][x2] = INT_MIN;
21
+ for (int k = 1 ; k < n * 2 - 1 ; ++k) { // k为两人步数之和,x为向右走的步数,y为向下走的步数。
22
+ // x_1+y_1 = x_2+y_2 = k
23
+ for (int x1 = min (k, n - 1 ); x1 >= max (k - n + 1 , 0 ); --x1) { // 枚举第一个人走的位置
24
+ for (int x2 = min (k, n - 1 ); x2 >= x1; --x2) { // 枚举第二个人走的位置
25
+ int y1 = k - x1, y2 = k - x2; // 根据步数和位置,计算出两个人的纵坐标
26
+ if (grid[x1][y1 ] == -1 || grid[x2][y2] == -1 ) { // 如果当前格子是障碍物,则无法通过
27
+ f[x1][x2] = INT_MIN; // 将当前状态设为无穷小,表示无法达到
29
28
continue ;
30
29
}
31
- int res = f[x1][x2]; // 都往右
32
- if (x1) {
33
- res = max (res, f[x1 - 1 ][x2]); // 往下,往右
30
+ int res = f[x1][x2]; // 初始化最大值为当前状态
31
+ if (x1) { // 第一个人可以向下走
32
+ res = max (res, f[x1 - 1 ][x2]); // 更新状态,加上向下走的樱桃数
34
33
}
35
- if (x2) {
36
- res = max (res, f[x1][x2 - 1 ]); // 往右,往下
34
+ if (x2) { // 第二个人可以向下走
35
+ res = max (res, f[x1][x2 - 1 ]); // 更新状态,加上向下走的樱桃数
37
36
}
38
- if (x1 && x2) {
39
- res = max (res, f[x1 - 1 ][x2 - 1 ]); // 都往下
37
+ if (x1 && x2) { // 两个人都可以向下走
38
+ res = max (res, f[x1 - 1 ][x2 - 1 ]); // 更新状态,加上向下走的樱桃数
40
39
}
41
- res += grid[x1][y1 ];
40
+ res += grid[x1][y1 ]; // 加上当前格子的樱桃数
42
41
if (x2 != x1) { // 避免重复摘同一个樱桃
43
- res += grid[x2][y2];
42
+ res += grid[x2][y2]; // 加上第二个人当前格子的樱桃数
44
43
}
45
- f[x1][x2] = res;
44
+ f[x1][x2] = res; // 更新当前状态
46
45
}
47
46
}
48
47
}
49
- return max (f.back ().back (), 0 );
48
+ return max (f.back ().back (), 0 ); // 返回俩人摘到的樱桃个数之和的最大值,注意要取0和最大值的较大值
50
49
}
51
50
};
0 commit comments