【发布时间】: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