我必须找到从上到下的最大路径总和,直到到达 矩阵的最后一行。
我必须使用一个返回最大和的递归函数。向下走时,我们只能向右或向左或向下或向右向下移动一行,并向右移动一列。我的代码仅返回矩阵的第一个索引。我的逻辑以及用于函数的参数是否正确?
import { Component, OnInit } from '@angular/core';
import { HttpClient } from '@angular/common/http';
@Component({
selector: 'app-root',
templateUrl: './app.component.html',
styleUrls: ['./app.component.css']
})
export class AppComponent implements OnInit {
constructor(private http: HttpClient) { }
}
答案 0 :(得分:1)
您的代码中存在多个问题:
if (i == 0 && j = 0)
中存在语法错误:应该为j == 0
,但是当您位于左上角时,没有理由返回,这是您的起点!;
末尾缺少return Mat[i][j]
MaximumPath(Mat, i - 1, j + 1)))
末尾有一个括号。i + 1
传递给对MaximumPath
而不是i - 1
的递归调用。您应该检查j
是否在矩阵边界内,如果不是,则返回0
,并将测试if (i = N || j < 0)
固定为
if (i >= N || j < 0 || J >= N)
max
函数也不正确:如果两个值相等且大于第三个值,则不会返回值。
这是更正的版本:
#include <stdio.h>
#define N 3
int MaximumPath(int Mat[][N], int i, int j);
int main() {
int mat[N][N], i, j;
int max;
printf("Enter the elements of the matrix :\n");
for (i = 0; i < N; i++) {
for (j = 0; j < N; j++) {
if (scanf("%d", &mat[i][j]) != 1)
return 1;
}
}
max = 0;
for (j = 0; j < N; j++) {
max = max3(max, max, MaximumPath(mat, 0, j));
}
printf("%d\n", max);
return 0;
}
int max3(int i, int j, int k) {
if (i >= j && i >= k) {
return i;
} else
if (j >= i && j >= k) {
return j;
} else {
return k;
}
}
int MaximumPath(int Mat[][N], int i, int j) {
// out of matrix boundaries
if (i >= N || j < 0 || j >= N)
return 0;
// compute the maximum path from the current cell
// for all possible directions:
return max3(MaximumPath(Mat, i + 1, j - 1),
MaximumPath(Mat, i + 1, j),
MaximumPath(Mat, i + 1, j + 1)) + Mat[i][j];
}
请注意,在递归之前测试边界会更有效:
int max(int i, int j) {
if (i >= j)
return i;
else
return j;
}
int MaximumPath(int Mat[][N], int i, int j) {
if (i >= N - 1) {
// reached the last row
return Mat[i][j];
} else {
// try all possible paths
int v = MaximumPath(Mat, i + 1, j)
if (j > 0)
v = max(v, MaximumPath(Mat, i + 1, j - 1));
if (j < N - 1)
v = max(v, MaximumPath(Mat, i + 1, j + 1));
return Max[i][j] + v;
}
}
答案 1 :(得分:1)
即使在全球范围内,关于如何找到最大值路径的想法都得到了尊重和理解,我仍然在您的代码中看到几个小问题。
如果我的解释正确的话,可能有以下三种动作:向下,向下和向左,向下和向右。
或多或少地提供了以下代码:
int MaximumPath(int Mat[][N], int i, int j){
// reached last row -> final case
if (i == N-1){
return Mat[i][j];
}
int max_value = MaximumPath(Mat, i+1, j);
int tmp;
if (j > 0){
tmp = MaximumPath(Mat, i+1, j-1);
if (tmp > max_value){
max_value = tmp;
}
}
if (j < N-1){
tmp = MaximumPath(Mat, i+1, j+1);
if (tmp > max_value){
max_value = tmp;
}
}
return max_value + Mat[i][j];
}