1463. Cherry Pickup II

纠结在相交的情况下该怎么处理。
该问题就是计算,假设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;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值