c - 找到边界元素之和最大的方子矩阵

标签 c

考虑一个由 0 到 9 的数字组成、宽度和高度可变的二维矩阵。找到边界元素之和最大的方子矩阵。

输入:

输入矩阵的宽和高:6 8

输入 0 到 9 之间的矩阵:

2 0 6 1 2 5 1 0 5 0 1 3 3 0 1 2 4 1 0 1 3 1 1 9 4 1 0 8 5 2 0 1 0 1 2 3 6 5 3 1 0 2 0 0 1 6 0 4 输入方形子矩阵的最大宽度(方形子矩阵的高度和宽度相同):3

输出:

由于突出显示的子矩阵之和最大(仅计算边界元素之和2,4,1,9,2,5,8,1),

2 0 6 1 2 5 1 0 5 0 1 3 3 0 1 2 4 1 0 1 3 1 1 9 4 1 0 8 5 2 0 1 0 1 2 3 6 5 3 1 0 2 0 0 1 6 0 4 输出应该是:

2 4 1
1 1 9
8 5 2

请用伪代码解释一下......

最佳答案

#include <bits/stdc++.h>
using namespace std;
#define R 8
#define C 6

// matrix of size R x C
void printMaxSumSub(int mat[R][C], int k)
{
    if (k > C) return;

    int stripSum[R][C];

// Go column by column
for (int j=0; j<C; j++)
{

    int sum = 0;
    for (int i=0; i<k; i++)
        sum += mat[i][j];
    stripSum[0][j] = sum;

    //  sum of remaining rectangles
    for (int i=1; i<R-k+1; i++)
    {
        sum += (mat[i+k-1][j] - mat[i-1][j]);
        stripSum[i][j] = sum;
    }
}

// max_sum stores maximum sum 

int max_sum = INT_MIN, *pos = NULL;

for (int i=0; i<R-k+1; i++)
{
    int sum = 0;
    for (int j = 0; j<k; j++)
        sum += stripSum[i][j];
    if (sum > max_sum)
    {
        max_sum = sum;
        pos = &(mat[i][0]);
    }

    for (int j=1; j<R-k+1; j++)
    {
        sum += (stripSum[i][j+k-1] - stripSum[i][j-1]);

        if (sum > max_sum)
        {
            max_sum = sum;
            pos = &(mat[i][j]);
        }
    }
}

for (int i=0; i<k; i++)
{
    for (int j=0; j<k; j++)
        cout << *(pos + i*C + j) << " ";
    cout << endl;
    }
}

//  function
int main()
{
    int mat[R][C] = {{2, 0 ,6 ,1 ,2, 5},    
    {1, 0, 5, 0 ,1, 3}, 
    {3 ,0, 1 ,2 ,4 ,1}, 
    {0 ,1, 3, 1, 1, 9}, 
    {4 ,1, 0 ,8 ,5 ,2}, 
    {0 ,1, 0, 1 ,2 ,3},
    {6 ,5 ,3 ,1 ,0, 2},
    {0 ,0, 1, 6, 0, 4}  
    };
    int k = 3;

cout << "the  sum  of 3 x 3 matrix is\n";
printMaxSumSub(mat, k);

    return 0;
}


//Output

the  sum  of 3 x 3 matrix is                                                                                                     
2 4 1                                                                                                                            
1 1 9                                                                                                                            
8 5 2  

关于c - 找到边界元素之和最大的方子矩阵,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49319569/

相关文章:

c - C语言代码的问题

c++ - 为什么用循环或 switch 语句内联函数不划算?

c - 套接字关闭时取消阻止 recvfrom

c - `#include <gmpxx.h>` 无法用 `fatal error: iosfwd: No such file or directory` 编译

C中改变变量的值

c 编程搜索文件中的字符串

c - 如何使C找到所有不同的符号(+,-,*,/)组合以获得一定的输出

c - 使用递归错误反转链表

C中 "pow"函数的组成

c - 如何预加载大型数组以并行缓存?