我正在为一家名为Code Nation的公司进行测试,并且遇到了这个问题,要求我计算一个数字k出现在子矩阵M [n] [n]中的次数。现在有一个例子说输入就像这样。
5
1 2 3 2 5
36
M[i][j]
由a[i]*a[j]
计算
在计算上我可以计算出来。
1,2,3,2,5
2,4,6,4,10
3,6,9,6,15
2,4,6,4,10
5,10,15,10,25
现在我必须计算36在M的子矩阵中出现的次数。
答案是5。
我无法理解如何计算这个子矩阵。如何表现呢? 我有一个天真的方法导致了许多矩阵,我认为没有一个是正确的。
其中一个是Submatrix [i] [j]
1 2 3 2 5
3 9 18 24 39
6 18 36 60 99
15 33 69 129 228
33 66 129 258 486
这是通过将0,0之前的所有数字添加到i,j
而形成的在这36次没出现5次所以我知道这是不正确的。如果你可以使用一些伪代码备份它,那将是锦上添花。
感谢帮助
答案 0 :(得分:1)
我的猜测是你必须计算M的总和等于36的子矩阵。
这是Matlab代码:
a=[1,2,3,2,5];
n=length(a);
M=a'*a;
count = 0;
for a0 = 1:n
for b0 = 1:n
for a1 = a0:n
for b1 = b0:n
A = M(a0:a1,b0:b1);
if (sum(A(:))==36)
count = count + 1;
end
end
end
end
end
count
打印出5。
所以你正确计算M,但是你必须考虑M的每个子矩阵,例如,M是
1,2,3,2,5
2,4,6,4,10
3,6,9,6,15
2,4,6,4,10
5,10,15,10,25
所以一个可能的子矩阵是
1,2,3
2,4,6
3,6,9
如果你把所有这些加起来,那么总和等于36。
有answer on cstheory为此提供O(n ^ 3)算法。