LeetCode 741. 摘樱桃 (网格DP)

741. 摘樱桃

const int N = 52;
class Solution {
    
    
public:
    int cherryPickup(vector<vector<int>>& G) {
    
    
        int n = G.size();   
        vector<vector<int>> g(n+1,vector<int>(n+1));
        for(int i=0;i<n;i++)
            for(int j=0;j<n;j++)
                g[i+1][j+1] = G[i][j];  
        int f[2*N][N][N];
        // -1 不可达
        memset(f,0xcf,sizeof f);
        f[2][1][1] = g[1][1];
        for(int k=2;k<=2*n;k++){
    
    
            for(int x1=1;x1<=n;x1++){
    
    
                for(int x2=1;x2<=n;x2++){
    
    
                    int y1 = k-x1;
                    int y2 = k-x2;
                    if(y1>=1 && y2>=1 && y1<=n && y2<=n && g[x1][y1]!=-1 && g[x2][y2]!=-1){
    
    
                        int &x = f[k][x1][x2];
                        int val = g[x1][y1];
                        if(x1 != x2) val += g[x2][y2];
                        x = max(x,f[k-1][x1-1][x2-1]+val);
                        x = max(x,f[k-1][x1][x2-1]+val);  
                        x = max(x,f[k-1][x1-1][x2]+val);
                        x = max(x,f[k-1][x1][x2]+val);
                    }
                }
            }
        }
        return max(0, f[2*n][n][n]);
    }
};

猜你喜欢

转载自blog.csdn.net/qq_44846324/article/details/109006869