二维矩阵中的最大路径总和

时间:2019-04-06 08:34:56

标签: c

我必须找到从上到下的最大路径总和,直到到达 矩阵的最后一行。

我必须使用一个返回最大和的递归函数。向下走时,我们只能向右或向左或向下或向右向下移动一行,并向右移动一列。我的代码仅返回矩阵的第一个索引。我的逻辑以及用于函数的参数是否正确?

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) { }
}

2 个答案:

答案 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函数也不正确:如果两个值相等且大于第三个值,则不会返回值。

  • 您可能应该尝试其他起点,例如(0,1)和(0,2)。否则,这些单元格以及单元格(1、2)的输入值将无济于事。

这是更正的版本:

#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];
}