编程任务:子矩阵之和

时间:2014-12-21 12:43:17

标签: c++ algorithm matrix

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

任务文本如下
我们有一个大小为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)是子矩阵右下角的列和行。我们必须计算所有子矩阵的总和并将其划分为等价类(如果总和相等,则子矩阵属于一个类)。

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

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

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,它给出了一些非常有用的建议 有最后的code.
除非我提出一个非常具体的问题(基于Yakk给我的信息)link.,我以前奇怪地找不到非常有用的链接 我希望我的代码将来可能对某人有所帮助。

1 个答案:

答案 0 :(得分:2)

建立总和矩阵。

在和矩阵中的位置(a,b),对原始矩阵中(a,b)左边和上面(包括(a,b))的所有元素的总和求和。

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

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

如果你仔细考虑,建立总和矩阵只需要适度的工作量。