首页 > 试题广场 >

以下函数用于找到整数矩阵matrix中,元素之和最大的n行m

[问答题]
以下函数用于找到整数矩阵matrix中,元素之和最大的n行m列的子矩阵的元素之和。请指出程序代码中错误的地方(问题不止一处,请尽量找出所有你认为错误的地方),并在不新增代码行的情况下将问题修复。
 1 int maxSubmatrixSum(std::vector<std::vector<int>> matrix,
 2                     int n, int m) {
 3   int base_sum;
 4   for (int i = 0; i < n; i++){
 5     for (int j = 0; j < m; j++){
 6       base_sum += matrix[i][j];
 7     }
 8   }
 9   int result = 0;
10   for (int i = 0; i + n < matrix.size(); i++) {
11     if(i  > 0){
12       for (int y = 0; y < m; y++){
13         base_sum += matrix[i + n][y] - matrix[i - 1][y];
14       }
15     }
16     int real_sum = base_sum;
17     if (real_sum  > result) {
18       result = real_sum;
19     }
20     for (int j = 0; j + m < matrix.size(); j++) {
21       for (int x = 0; x < n; x++) {
22         real_sum += matrix[x][j + m] - matrix[x][j - 1];
23       }
24       if (real_sum > result) {
25         result = real_sum;
26       }
27     }
28   }
29   return result;
30 }

 int base_sum=0;
发表于 2019-10-11 14:57:59 回复(0)
发表于 2021-07-18 09:32:39 回复(0)
function maxSubmatrixSum(matrix,n,m) { let real_sum = 0; let result = 0; for (let i = 0; i+n-1< matrix.length; i++) { for (let j = 0; j + m - 1< matrix[0].length; j++) { if (j == 0){ real_sum = 0; for (let x=i;x<i+n;x++){ for (let y=0;y<m;y++){ real_sum += matrix[x][y]
                         }
                     } //console.log(real_sum)  } else { for (let x=i; x < i+n; x++) { real_sum += matrix[x][j + m - 1] - matrix[x][j - 1];
                     } //console.log(real_sum)  } if (real_sum > result) { result = real_sum;
                 }
             }
           } console.log(result)
     } const matrix = [
    [2,4,6,8],
    [1,3,5,7],
    [1,2,4,8],
    [3,6,7,9]
]; const n = 2; const m = 2; maxSubmatrixSum(matrix,n,m)
发表于 2018-08-11 00:17:42 回复(0)
int maxSubmatrixSum(std::vector<std::vector<int>> matrix, int n, int m) {
    int base_sum;
    for (int i = 0; i < n; i++){
        for (int j = 0; j < m; j++){
            base_sum += matrix[i][j];
        }
    }
    int result = 0;
    for (int i = 0; i + n <= matrix.size(); i++) { // 下移 i 行
        if (i > 0) {
            for (int y = 0; y < m; y++) {
                base_sum += matrix[i-1+n][y] - matrix[i - 1][y];
            }
        }
        int real_sum = base_sum;
        if (real_sum  > result) {
            result = real_sum;
        }
        for (int j = 0; j + m < matrix.size(); j++) { // 右移
            for (int x = 0; x < n; x++) {
                real_sum += matrix[x + i][j + m] - matrix[x + i][j];
            }
            if (real_sum > result) {
                result = real_sum;
            }
        }
    }
    return result;
}
编辑于 2018-05-06 00:40:45 回复(0)
// 对这个问题,我的理解是在一个已知的矩阵中有一个n*m的小矩阵,然后怎样使其数值最大,不知道理解的对不对;另外对实现该方法的语言也不了解,所以只是找出一些基本的错误
 1 int maxSubmatrixSum(std::vector<std::vector<int>> matrix,
 2                     int n, int m) {
 3   int base_sum = 0; 
 4   for (int i = 0; i < n; i++){
 5     for (int j = 0; j < m; j++){
 6       base_sum += matrix[i][j];
 7     }
 8   }
 9   int result = 0;
10   for (int i = 0; i + n < matrix.size(); i++) {         
 // matrix.size()不是很清楚什么意思,这里应该需要的是行数,也许需要改为类似于matrix.size(y),下面同理
11      int real_sum = base_sum;
12      if(i  > 0) {
13        for (int y = 0; y < m; y++){
14           real_sum += matrix[i + n][y] - matrix[i - 1][y]; // 这里的值应该是作为一个变量,在每次循环时应该清零
15        }
16      }
17     if (real_sum  > result) {
18       result = real_sum;
19     }
20     for (int j = 0; j + m < matrix.size(); j++) {
21       for (int x = 0; x < n; x++) {
22         real_sum += matrix[x][j + m] - matrix[x][j - 1];
23       }
24       if (real_sum > result) {
25         result = real_sum;
26       }
27     }
28   }
29   return result;        // 最后,总感觉这个算法有问题,x,y是互不相干的,所以不能先确定好其中一个的最大值,然后在去弄另一个
30 }
发表于 2018-05-02 18:09:28 回复(0)