【问题标题】:Memoization Approach for Gold Mine Problem on GFGGFG上金矿问题的记忆方法
【发布时间】:2021-09-08 12:40:45
【问题描述】:

我正在尝试使用基于记忆的动态编程方法来解决 GFG 上的Gold Mine problem。这是我写的代码。

int dp[50][50];


int traverse(int x,int y,int n,int m, vector<vector<int>> M){
    
    if((x<n and x>=0) and (y<m and y>=0))
        {
        
            if(dp[x][y]!=-1)
                return dp[x][y];
            else{
                
            
                int right=M[x][y]+traverse(x,y+1,n,m,M);
                int right_up=M[x][y]+traverse(x-1,y+1,n,m,M);
                int right_down=M[x][y]+traverse(x+1,y+1,n,m,M);
                return dp[x][y]=max(max(right,right_up),right_down);}
            
        }
    return 0;
    
    
    
}

int maxGold(int n, int m, vector<vector<int>> M)
{
    
    
    for(int i=0;i<n;i++){
        for(int j=0;j<m;j++){
            dp[i][j]=-1;
        }
    }
    int ans=0;
    for(int i=0;i<n;i++){
        ans=max(ans,traverse(i,0,n,m,M));
    }
    return ans;

 }

问题说我们可以从第一列的任何单元格开始。 由于未指定特定单元格,因此我尝试以第一列的每个单元格作为起点,找出所有可能答案的最大值。但这给出了一个 TLE,这是预期的,因为上面的代码需要 o(n^2*m) 时间。

谁能帮助我解决这个问题,即最佳地确定从哪个单元开始,以便基于记忆的方法在提供的时间限制下工作?

【问题讨论】:

    标签: c++ algorithm dynamic-programming


    【解决方案1】:

    对 STL 容器使用由 const 引用调用。您执行了数千份完整的只读输入。

    int dp[55][55];
    int traverse(int x,int y,int n,int m, const vector<vector<int>>&M){
        . . .
    }
    
    int maxGold(int n, int m, const vector<vector<int>>&M)`
    {
        ...
    }
    

    【讨论】:

      【解决方案2】:

      这是我的解决方案:

      class Solution{
      public:
          int maxGold(int n, int m, vector<vector<int>> M)
          {
              vector<vector<int>> f(n + 10, vector<int>(m + 10, 0));
              
              for(int i = 0; i < n; i++){
                  f[i][0] = M[i][0];
              }
              
              for(int j = 1; j < m; j++){
                  for(int i = 0; i < n; i++){
                      if(i == 0){
                          f[i][j] = max(f[i][j-1], f[i+1][j-1]) + M[i][j];
                      }else if(i == n-1){
                          f[i][j] = max(f[i][j-1], f[i-1][j-1]) + M[i][j];
                      }else{
                          f[i][j] = max({f[i][j-1], f[i-1][j-1], f[i+1][j-1]}) + M[i][j];
                      }
                  }
              }
              
              int res = 0;
              for(int i = 0; i < n; i++){
                  res = max(res, f[i][m-1]);
              }
              return res;
          }
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-17
        • 2023-02-04
        • 2019-06-13
        • 2013-01-05
        • 1970-01-01
        • 2015-02-17
        • 2019-07-26
        • 2013-08-14
        相关资源
        最近更新 更多