计算四次整数的数量

时间:2015-05-20 15:11:25

标签: algorithm depth-first-search

  

我今天看到这个问题,我们需要计算数量   四倍整数   (X1, X2, X3, X4),使得Li≤Xi≤Ri为i   = 1,2,3,4和X1≠X2,X2≠X3,X3≠X4,X4≠X1。

    input:
     Li Ri
     1  4 
     1  3 
     1  2 
     4  4

output:
8

1 2 1 4
1 3 1 4
1 3 2 4
2 1 2 4
2 3 1 4
2 3 2 4
3 1 2 4
3 2 1 4

我最初的想法是使用

  

包含排除原则

如果不受限制的四倍,我能够找到数字,但我无法弄清楚如何找到剩余条件以达到最终解决方案。我也开始知道这个问题可以使用DFS完成。

我们如何使用包含排除/ DFS来执行此问题

2 个答案:

答案 0 :(得分:2)

包含/排除将为您提供四倍的数量,但不会自己提供四倍。

对于所有j,令Ai是满足Lj< = Xj< = Rj的四元组的集合,其中Xi = X(i + 1)(其中索引是循环的,因此X5表示X1)。在您提供的示例中,

A1 = { (1114), (1124), (2214), (2224), (3314), (3324) }
A2 = { (1114), (2114), (3114), (4114), (1224), (2224), (3224), (4224) }
A3 = { } (empty set)
A4 = { (4114), (4214), (4314), (4124), (4224), (4324) }

我们还需要成对的交集:

A1 cap A2 = { (1114), (2224) } (note first three numbers identical)
A1 cap A3 = { }
A1 cap A4 = { } (can't have X4=X1=X2)
A2 cap A3 = { }
A2 cap A4 = { (4114), (4224) }
A3 cap A4 = { }

集合三元组的交叉点:

A1 cap A2 cap A3 = { }
A1 cap A2 cap A4 = { }
A1 cap A3 cap A4 = { }
A2 cap A3 cap A4 = { }

所有集合的交集:

A1 cap A2 cap A3 cap A4 = { }

Inclusion/exclusion以其互补的形式告诉我们

|intersection of complements of Ai| = |unrestricted quadruples| 
- sum of |Ai| + sum of |Ai cap Aj| - sum of |Ai cap Aj cap Ak| 
+ sum of |Ai cap Aj cap Ak cap Al|

其中没有索引i,j,k,l相等。在您的示例中,

|intersection of complements of Ai| = 4x3x2x1 - (6+8+0+6) + (2+0+0+0+2+0) - (0+0+0+0) + 0 
= 24 - 20 + 4 - 0 + 0 = 8

为了找到| Ai |和它们的交叉点,你必须找到间隔[Li,Ri]的交叉点,并将交叉点的长度乘以无限制间隔的长度。例如,

|A1| = |[1234] cap [123]| x |[12]| x |[4]| = 3 x 2 x 1 = 6
|A2 cap A4| = |[123] cap [12]| x |[4] cap [1234]| = |[12]| x |[4]| = 2 x 1 = 2

在这种方法中,我没有看到第一次搜索的深度与它有什么关系。

答案 1 :(得分:1)

这取决于集合是不相交还是共享元素。对于n = 4,意思是四元组,正如你所问的那样,如果我们将结束提交给描述x_1X2成员的四种类型,我认为我将其归结为1到4次迭代x_4 X3成员。{/ p>

三次迭代的示例:

input = {1,2,3}{1,2}{1,2,3}{3,4}

2 * (1)(12)(123)(3) = (1)(2)(1)(3) = 2 * 1          // x_1 ∈ X2, x_4 ∈ X3
2 * (1)(12)(123)(4) = (1)(2)(13)(4) = 2 * 2          // x_1 ∈ X2, x_4 ∉ X3
1 * (3)(12)(123)(4) = (3)(12)(12,3)(4) = 1 * (2 + 2)  // x_1 ∉ X2, x_4 ∉ X3
Total = 10

一次迭代的示例:

input = {1,2,3,4}{1,2,3,4}{1,2,3,4}{1,2,3,4}          // x_1 ∈ X2, x_4 ∈ X3

12 * (1)(1234)(1234)(2) = (1)(2,34)(134)(2) = 12 * (3 + 4)
Total = 84