编程任务:子矩阵的总和
Programming task: sum of submatrices
我在解决编程任务时遇到问题。事实上,我解决了它,但我的代码没有通过一些测试(时间过度播种(。
任务文本如下:
我们有一个大小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,看看如何。
如果将存储的数据加倍,则可以将查找次数减半。 但我不会打扰。
如果您仔细操作,构建总和矩阵只需要少量的工作。
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 有没有任务栏API可以立即应用注册表更改
- 模板元编程:如何将参数包组合成新的参数包
- Qt Q串行端口未编程设备未关闭
- 模板元编程 - 尝试实现维度分析
- 我是编程新手
- 如何以编程方式获取任务管理器进程CPU使用率(不是PerfMon API)
- 我是 c++ 编程的新手,我一直在做以下任务:
- 使用BFS/DFS解决编程任务
- 当我打开一个新对话框时,如何禁止在Qt编程的Windows任务栏中显示对话框
- 以编程方式简化 Windows 的计划任务
- 如何验证竞争性编程任务的动态编程解决方案的正确性
- 编程任务问
- 如何在正常用户环境中以编程方式隐藏 Windows 8 上的任务栏
- 编程任务:子矩阵的总和
- 在编程中,这两项任务中的任何一项都有算法方法吗
- 以编程方式更改任务栏图标(Win32, c++)
- 在TBB中使用递归、基于任务的并行编程获得不同的输出
- 以编程方式为任务调度程序创建/删除任务