【第27场双周赛】Leetcode-1463 摘樱桃

三维dp+五重循环,我只想感叹疯狂套娃。

思路

定义
dp[i][j1][j2]:表示在i层,左侧机器人在j1处,右侧机器人在j2处。
初始化
dp[0][0][cols-1] = grid[0][0] + grid[0][cols-1];
递推公式(j1!=j2时)
dp[i][j1][j2]=max(dp[i][j1][j2],dp[i-1][index1][index2]+grid[i][j1]+grid[i][j2]);
两个注意点
1.j1j2能达到的范围和row有关系。
2.if(j1==j2)本轮只能加一个值

代码

class Solution {
public:
    int cherryPickup(vector<vector<int>>& grid) {
        int rows=grid.size();
        int cols=grid[0].size();
        int move[3]={-1,0,1};
        int res=0;
        vector<vector<vector<int>>> dp(rows,vector<vector<int>>(cols,vector<int>(cols,0)));
        dp[0][0][cols-1] = grid[0][0] + grid[0][cols-1];
        for(int i=1;i<rows;i++)
        {
            for(int j1=0;j1<min(i+1,cols);j1++)
            {
                for(int j2=cols-1;j2>=max(cols-i-1,0);j2--)
                {
                    for(int k1=0;k1<3;k1++)
                    {
                        for(int k2=0;k2<3;k2++)
                        {
                            int index1=j1+move[k1];
                            int index2=j2+move[k2];
                            //越界
                            if(index1<0||index1>=cols||index2<0||index2>=cols)
                                continue;
                            if(j1!=j2)
                            dp[i][j1][j2]=max(dp[i][j1][j2],dp[i-1][index1][index2]+grid[i][j1]+grid[i][j2]);
                            else
                            dp[i][j1][j2]=max(dp[i][j1][j2],dp[i-1][index1][index2]+grid[i][j1]);
                        }
                    }
                }
            }
        }
            for(int j1=0;j1<cols;j1++)
            {
                for(int j2=cols-1;j2>=0;j2--)
                    res=max(res,dp[rows-1][j1][j2]);
            }
        
        return res;
    }
};

你可能感兴趣的:(Leetcode)