给定N个整数区间,每个区间形式为[a,b],其中包含从a到b的整数。
从每个区间我们必须选择1个数字,这样所有选择的数字的按位OR = X. X是众所周知的。
当我们从每个区间有多个候选人来形成X时,我被困住了。
这是我能够想到的:
Algo:
1)从每个区间消除j = 1
中位j = 0
和位X
的数字。
2)现在找到所需的号码。
问题出现在step 2
。
考虑区间:[1,3] [17,19] [15,18]
设X为17 =(10001)1
1110001
10010个
1001101111
10000个
10001个
10010应用算法的第1步:
00001(1)
10001(17)
10000(16)
10001(17)第2步: 可能的对:
1)1,17,16
2)1,17,17
现在我们必须选择每个可能的对并检查它们的OR是否等于X.
如果对很大,则需要很长时间才能得到答案。
那么,可以应用一些不错的技巧(优化上述)或任何其他算法来解决它吗?
答案 0 :(得分:1)
这是一种完全不同的方式。
对于每个范围r[i] = (a, b)
,创建一个表达x[i]
事实的BDD a <= v[i] <= b
。
创建另一个表达OR[0 <= i < n](v[i]) == X
将所有这些BDD相交。在结果上,找到任何解决方案。
作为奖励,您还可以:
存在一个缺点,即对于某些输入,BDD的大小将会爆炸。
顺便说一下,这是由this website处理的方式(当BDD变得太大时它将切换到SAT求解器,然后它将无法再报告解决方案的数量)