纠结在相交的情况下该怎么处理。
该问题就是计算,假设A\B两人停在row-1行的各个位置,他们到达当前位置,路上和的最大值。
dp[i][j1][j2] 定义为A停在[i][j1] B在[i][j2],他们到达当前位置,路上和的最大值。
那么dp[i][j1][j2] = max(dp[i][j1-1:j1+1][j2-1:j2+1] )+grid[i][j1]+grid[i][j2]*(j1!=j2)
然后利用这个dp,就可以天然的解决这问题。
class Solution {
public:
int cherryPickup(vector<vector<int>>& grid) {
int row = grid.size();
int col = grid[0].size();
vector<int> temp1(col, -1e9);
vector<vector<int>> temp2(col, temp1);
vector<vector<vector<int>>> dp(row, temp2); // dp: [row, col, col]
dp[0][0][col-1] = grid[0][0] + grid[0][col-1];
for(int i = 1;i<row;i++){
for(int j1 = 0; j1<col; j1++){
for(int j2=0;j2<col;j2++){
if (i-1>=0&&j1-1>=0&&j2-1>=0){
dp[i][j1][j2] = max(dp[i][j1][j2], dp[i-1][j1-1][j2-1]);
}
if (i-1>=0&&j1-1>=0){
dp[i][j1][j2] = max(dp[i][j1][j2], dp[i-1][j1-1][j2]);
}
if (i-1>=0&&j1-1>=0&&j2+1<col){
dp[i][j1][j2] = max(dp[i][j1][j2], dp[i-1][j1-1][j2+1]);
}
if (i-1>=0&&j2-1>=0){
dp[i][j1][j2] = max(dp[i][j1][j2], dp[i-1][j1][j2-1]);
}
if (i-1>=0){
dp[i][j1][j2] = max(dp[i][j1][j2], dp[i-1][j1][j2]);
}
if (i-1>=0&&j2+1<col){
dp[i][j1][j2] = max(dp[i][j1][j2], dp[i-1][j1][j2+1]);
}
if (i-1>=0&&j1+1<col&&j2-1>=0){
dp[i][j1][j2] = max(dp[i][j1][j2], dp[i-1][j1+1][j2-1]);
}
if (i-1>=0&&j1+1<col){
dp[i][j1][j2] = max(dp[i][j1][j2], dp[i-1][j1+1][j2]);
}
if (i-1>=0&&j1+1<col&&j2+1<col){
dp[i][j1][j2] = max(dp[i][j1][j2], dp[i-1][j1+1][j2+1]);
}
if (j1==j2){
dp[i][j1][j2] += grid[i][j1];
}
else{
dp[i][j1][j2] += grid[i][j1]+grid[i][j2];
}
}
}
}
// find max[row-1][:][:]
int maxres = -1e9;
for(int i=0;i<col;i++){
for(int j=0;j<col;j++){
maxres = max(maxres, dp[row-1][i][j]);
}
}
return maxres;
}
};