编程任务:子矩阵的总和

Programming task: sum of submatrices

本文关键字:任务 编程      更新时间:2023-10-16

我在解决编程任务时遇到问题。事实上,我解决了它,但我的代码没有通过一些测试(时间过度播种(。

任务文本如下
我们有一个大小N*N矩阵。输入的第一行包含两个 int:N 和 K.K 是定义子矩阵的多行。
接下来N行包含主矩阵的元素(空格作为元素的分量,n作为线的分量(。之后,我们有定义子矩阵的 K 行。

定义如下
y_l x_l y_r x_r其中(x_l, y_l)是主矩阵中子矩阵左上角的列和行,(x_r, y_r)是子矩阵右下角的列和行。我们必须计算所有子矩阵的总和并将其划分为等价类(如果总和相等,则子矩阵属于一个类(。

程序输出应如下:
三个整数(除以空格(,其中第一个是等价类的数量,第二个是具有最大元素的等价类的数量,第三个是所有子矩阵之和的平均值。

从测试中,我发现问题在于计算总和:

while(true){
    for(int i = x_l; i <= x_r; i++)
        sum += *diff++;
    if(diff == d_end) break;
    d_start = d_start + size;
    diff = d_start;
}

但我不知道如何优化它。也许有人可以给我算法或一些想法,如何更快地计算这些总和。谢谢。

更新:答案
经过几天的搜索,我终于得到了我的程序的工作版本。感谢Yakk,它提供了一些非常有用的建议。
有最终代码。
非常有用的链接,除非我问一个非常具体的问题(基于 Yakk 给我的信息(链接,否则我以前找不到。
我希望我的代码将来可能对某人有所帮助。

构建一个总和矩阵。

在总和矩阵中的位置 (a,b( 处,对原始矩阵中 (a,b( 的所有剩余及以上元素(包括 (a,b((的总和求和。

现在计算子矩阵的总和是 4 次查找,一次加法和两次减法。 绘制一个 4x4 矩阵,并用这样的总和表示右下角的 2x2,看看如何。

如果将存储的数据加倍,则可以将查找次数减半。 但我不会打扰。

如果您仔细操作,构建总和矩阵只需要少量的工作。