生成Davenport-Schinzel序列


11

背景

Davenport-Schinzel序列具有两个正整数参数dn。我们将通过给定参数来表示所有Davenport-Schinzel序列的集合DS(d,n)

考虑自然数的所有序列1n,包容性,满足:

  • 序列中没有两个连续的数字相同。
  • 没有长度大于的子序列(不一定是连续的)d,它在两个不同的数字之间交替。

L表示这样一个序列的最大长度(给定dn)。然后,DS(d,n)是所有具有length的此类序列的集合L

一些示例可能会有所帮助。让d = 4n = 3。具有这些约束的最长序列可能具有L = 8。因此,以下成员是DS(4,3)

[1, 2, 1, 3, 1, 3, 2, 3]

没有连续的相同数字,并且存在交替的length子序列4,但没有更长的子序列:

 1  2  1           2
 1  2        1     2
 1        3  1  3
 1        3  1        3
    2     3        2  3
    2           3  2  3
       1  3  1  3
       1  3  1        3

下面的例子是不是DS(4,3)

[1, 2, 2, 3, 1, 3, 2, 3]  # Two consecutive 2's.
[1, 2, 1, 3, 1, 3, 2, 1]  # Contains alternating subsequences of length 5.
[1, 2, 1, 3, 1, 3, 2]     # Longer valid sequences for d = 4, n = 3 exist.

有关更多信息,请参见MathWorldOEIS及其列出的参考。

挑战

给定两个正整数,nd,在中生成任何Davenport-Schinzel序列DS(d,n)。请注意,这些通常不是唯一的,因此请输出任何单个有效结果。

您可以编写程序或函数,通过STDIN(或最接近的替代方案),命令行参数或函数自变量获取输入,然后从函数返回结果或将结果打印到STDOUT(或最接近的替代方案)。

您可以使用任何方便,明确的字符串或列表格式进行输出。

这是代码高尔夫球,因此最短的提交(以字节为单位)获胜。

序列长度

由于序列不是唯一的,因此在此挑战中,单个示例没有太多用处。但是,对于任何输出而言,这两个一般的有效性问题都相当容易检查,因此主要问题是该序列是否具有正确的长度(或者存在更长的有效序列)。因此,这是给定和的已知1 的列表:Ldn

 \ 
 d\n 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 
   \-----------------------------------------------------------
 1 | 1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1  1
 2 | 1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
 3 | 1  3  5  7  9 11 13 15 17 19 21 23 25 27 29 31 33 35 37 39
 4 | 1  4  8 12 17 22 27 32 37 42 47 53 58 64 69 75 81 86 92 98
 5 | 1  5 10 16 22 29 ...
 6 | 1  6 14 23 34 ...
 7 | 1  7 16 28 41 ...
 8 | 1  8 20 35 53 ...
 9 | 1  9 22 40 61 ...
10 | 1 10 26 47 73 ...

您不得将此表中的任何信息硬编码到提交中。

1该表来自1994年,因此此后可能会有更多的进步,但是我怀疑任何提交都将能够在合理的时间内处理该表中的更大条目。

Answers:


2

Python 2:172

from itertools import*
d,n=input();S=[[1]]
for s in S:
 for v in range(1,n+1):
  if(v!=s[-1])*all(w[2:]!=w[:-2]for w in combinations(s+[v],d+1)):S.append(s+[v])
print S[-1]

输入只是简单的格式4, 3

我迭代地创建了所有序列,它们以1和满足这两个属性,并将它们存储在中S。由于我按排序顺序创建了它们(按长度[和值]排序),因此最后一个条目必须是Davenport-Schinzel序列。使用一个很好的事实,您可以在附加列表的同时迭代列表。


如果您已经在使用python2,则可以通过将标签(我假设是两个空格)组合到一个标签中来节省一个字节。如我错了请纠正我。
扎卡里
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.