最大子矩阵nxn个矩阵的和

本文关键字:nxn | 更新日期: 2023-09-27 17:49:13

我试图从给定的nxn矩阵中获得最大的子矩阵和。据我所知,该算法的复杂度为n^3 (kadane)。我试图在java中使用我在stackoverflow上找到的代码实现它(由Anders Gustafsson在这些帖子中用c#编写),但它似乎并不总是工作。

我的代码是:

public static void maxSubMatrix(int matrix[][]) {
    // O(n^3) Max Sum Submatrix
    int row = matrix.length;
    int col = matrix[0].length; // Get the col-length by taking the length of 
                                // row 0 (in programm the matrices will be n x n)
    // Initialise maxSum
    int maxSum = 0;
    // Set left column
    for (int left=0; left<col; left++) {
        // Initialise array
        int tempArray[] = new int[row];
        // Set right column by left column (outer loop)
        for (int right=left; right<col; right++){
            // Calculate sum between current left-right for every row 'i'
            for (int i=0; i<row; i++)
                tempArray[i] = matrix[i][right];
            // ----
            // Find maximum sum in tempArray[]
            int sum = maxSubArray(tempArray);
            // Compare sum with maxSum so far, and update it if necessary
            if (sum > maxSum) maxSum = sum;
        }
    }
    System.out.println(maxSum);
}
// ==========================
public static int maxSubArray(int array[]){
    // Kadane O(n) Max Sum Subarray
    int maxSum = 0;
    int tempSum = 0;
    for (int i=0; i<array.length; i++){
        int b = array[i];
        if (tempSum + b > 0) tempSum += b;
        else tempSum = 0;
        maxSum = Math.max(maxSum, tempSum);
    }
    return maxSum;
}

我有三个例子:

矩阵1
2 3
1 4
输出为0(空的0x0矩阵也是一个解)

矩阵2
2 1
2 1
输出为2

矩阵

3
1 3
3 1
输出为3,但应该是4

也许有人能看到错误。我也愿意接受全新的想法来实现它。

最大子矩阵nxn个矩阵的和

您刚刚忘记在temp-array中添加右边的下一个元素:

(int i=0; i<row; i++)
            tempArray[i] += matrix[i][right];

现在一切都好了!;)

Greetz

相关文章:
  • 没有找到相关文章