找到满足给定约束的给定2d阵列中的单元数

时间:2012-12-16 12:15:07

标签: algorithm graph graph-algorithm counting

给定一个从(0,0)开始的二维数组,并在正x和y轴上进入无穷大。给定数k> 0,找到可从(0,0)到达的单元的数量,使得在每个时刻 - > x的位数之和+ y <= k的位数之和。移动可以是向上,向下,向左或向右移动。给定x,y> = 0。
Dfs给出答案但不足以获得大的k值。任何人都可以帮助我更好的算法吗?

1 个答案:

答案 0 :(得分:0)

我认为他们要求你计算k> = x + y可达到的单元格数(x,y)。例如,如果x = 1,那么y可以取0和k-1之间的任何数,并且总和将是&lt; = k。可能的总数可以通过

计算
sum(sum(1,y=0..k-x),x=0..k) = 1/2*k²+3/2*k+1

那应该可以为大k做技巧。

我对你问题中的“数字”感到困惑。数字组成索引就像3次9使得999.单元格的数字总和(999,888)将是51.如果你允许数字之和为10 ^ 9那么你可能有10 ^ 8位数索引,导致大约10 ^(10 ^ 8)个条目,远远超出表的正常大小。因此,我假设我的第一个解释。如果这不正确,那你能解释一下吗?

编辑

好的,所以我的答案是不会解决它。我担心我没有看到一个很好的公式或答案。我会将其作为着色/标记问题处理并标记所有有效单元格,然后使用其他一些技术确保所有部件都连接/计算它们。

我试图想出一些东西,但它太乱了。基本上我会尝试根据索引和k一次标记大部分。如果k = 20,您可以一次标记单元格范围(0,0..299)(因为任何较低的索引将具有较低的索引和)并继续检查该范围的其余部分。我从299开始,将最后2位数字固定为最大值,然后查找第一位数的最大值。然后继续该过程剩余的数百(300-999)并且仅修复最后一个数字以300..389和390..398结束。但是,你已经可以看到它是一团糟......(不过我想把它给你,你可能会有更好的想法)

你可以立即看到的另一件事是你的问题在索引中是对称的,所以任何有效的单元格(x,y)都会告诉你还有另一个有效的单元格(y,x)。在标记方案/ dfs / bfs中,这可以被利用。

相关问题