@@ -18,34 +18,33 @@ class Solution {
1818 vector<vector<int >> f (
1919 n, vector<int >(n, INT_MIN)); // f 表示俩人摘到的樱桃个数之和的最大值
2020 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; // 将当前状态设为无穷小,表示无法达到
2928 continue ;
3029 }
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]); // 更新状态,加上向下走的樱桃数
3433 }
35- if (x2) {
36- res = max (res, f[x1][x2 - 1 ]); // 往右,往下
34+ if (x2) { // 第二个人可以向下走
35+ res = max (res, f[x1][x2 - 1 ]); // 更新状态,加上向下走的樱桃数
3736 }
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 ]); // 更新状态,加上向下走的樱桃数
4039 }
41- res += grid[x1][y1];
40+ res += grid[x1][y1]; // 加上当前格子的樱桃数
4241 if (x2 != x1) { // 避免重复摘同一个樱桃
43- res += grid[x2][y2];
42+ res += grid[x2][y2]; // 加上第二个人当前格子的樱桃数
4443 }
45- f[x1][x2] = res;
44+ f[x1][x2] = res; // 更新当前状态
4645 }
4746 }
4847 }
49- return max (f.back ().back (), 0 );
48+ return max (f.back ().back (), 0 ); // 返回俩人摘到的樱桃个数之和的最大值,注意要取0和最大值的较大值
5049 }
5150};
0 commit comments