我正在使用递归实现maxPathSum函数,我不知道在函数中使用两个调用时会发生什么。我知道然后调用 二进制递归,并知道如何从这个问题的答复中思考它 Understanding double recursion
但是当我编写代码时,它没有给我正确的答案 [注意]所需的唯一方向是向右和向下
#include <iostream>
#include<algorithm>
using namespace std;
const int MAX=3;
int grid[MAX][MAX]={
{5,1,2},
{6,4,8},
{1,8,9}
};
bool valid(int r, int c);//check not get out grid
int maxPathSum(int r,int c);
int main()
{
int sum=0;
for(int i=0;i<MAX;i++)
sum += maxPathSum(i,i);
cout<<"the sum of the longest path is: "<<sum;
}
int maxPathSum(int r,int c){
if(!valid(r,c))
return 1;
//Reach the last element in the last right down
if(r == MAX-1 && c == MAX-1)
return grid[r][c];
int path1=maxPathSum(r,c+1);//Right
int path2=maxPathSum(r+1,c);//down
return grid[r][c]+max(path1,path2);
}
bool valid(int r, int c){
if(r > MAX-1)
return false;
if(c > MAX-1)
return false;
return true;
}
当我在main中调用没有循环的函数时,它会给我正确的答案
类似于矩阵长度
const int MAX=2;
int grid[MAX][MAX]={
{5,2},
{1,8}
};
maxPathSum(0,0);
答案 0 :(得分:0)
你正在做一笔双倍的金额。
return grid[r][c]+max(path1,path2)
这段代码已经对路径上的元素进行了总结。
for(int i=0;i<MAX;i++)
sum += maxPathSum(i,i);
maxPathSum将返回(i,i)和(2,2)之间路径上所有元素的总和。然后sum将包含对角元素上所有这些和的总和。我不认为你想要那个。
在main中调用maxPathSum(0,0)应该给出答案。
现在假设您调用maxPathSum(1,2)。然后,此函数将调用maxPathSum(2,2)和maxPathSum(1,3)。第一个将返回e22,后者将返回1.如果e22 = 0,结果将不正确。
我正在回答问题,即找到(0,0)和(max-1,max-1)之间的最大路径。如果问题未定义,则应明确指出。