这里的想法是产生几乎重复的图案。即,正在构建的序列在最后时刻改变,以避免重复某些子序列。应避免使用AA和ABA类型的子序列(其中B不超过A)。
例子:
我将继续列出所有小例子,以使我的描述更加清楚。让我们从0开始。
有效:0 无效:00(AA模式) 有效期:01 无效:010(ABA模式) 无效:011(AA模式) 有效期:012 有效期:0120 无效:0121(ABA模式) 无效:0122(AA模式) 无效:01200(AA模式) 无效:01201(ABA模式; 01-2-01) 无效:01202(ABA模式) 有效期:01203
现在,我坚信4
即使我没有证明,也不需要a,因为我很容易找到了仅使用的数百个字符长的序列0123
。(这可能与如何只需要三个字符来具有不具有任何AA模式的无限字符串密切相关。此页面上有Wikipedia。)
输入输出
输入是一个非零的正整数n
。您可能会认为n <= 1000
。
输出是一个- n
字符序列,没有与禁止模式(AA或ABA)匹配的子序列。
样本输入和输出
>>> 1 0 >>> 2 01 >>> 3 012 >>> 4 0120 >>> 5 01203 >>> 50 01203102130123103201302103120132102301203102132012
规则
- 仅
0123
允许使用字符。 - B是不超过A.这是为了避免出现这种情况
012345
一直要遵循6
,因为0123451
有这样的:1-2345-1
。换句话说,该序列将是琐碎且无趣的。 n
可以通过任何所需的方法输入,硬编码除外。- 输出可以是列表,也可以是字符串,这取决于哪个更容易。
- 没有强力 ; 在非常慢的计算机上,运行时间应为几分钟左右,最多为一个小时
n=1000
。(这旨在取消仅循环遍历的所有n
排列的解决方案的资格{0,1,2,3}
,因此不允许使用技巧和类似技巧。) - 像往常一样,不允许出现标准漏洞。
- 得分以字节为单位。这是代码高尔夫球,因此最短的条目将获胜(可能-见奖金)。
- 奖励:在每一步中选择允许的最低数字。如果
1
并且3
是序列中下一位数字的可能选择,请选择1
。从您的分数中减去5个字节。但是,请注意以下注意事项。
注意!
死胡同是可能的。您的程序或函数必须避免这些。这是一个例子:
树桩:01203102130123103201302103120132102301203102132012302103120130231032012302132031023012032102312013201302103123013203102130120321023013203123021032012310213012031023023013203123021021320123102130120 树桩:01203102130123103201302103120132102301203102132012302103120130231032012302132031023012032102312013201310310301301320310213012032102301320312302103201231021301203102301313123123021320123102130123 树桩:01203102130123103201302103120132102301203102132012302103120130231032012302132031023012032102312013201310310301301320310213012032102301320312302103201231021301203102301320312302132012310320 树桩:0120310213012310320130210312013210230120310213201230210312013023103201230213203102301203210231201320130210312301320310213012032102301320312302103201231021301203102301320312302132012310321301203102130
这些序列中的每一个都不能进一步扩展(不使用4
)。但也请注意,前两个与后两个之间存在重要差异。我将用替换共享的初始子序列,X
以使其更清楚。
树桩:X2130120 树桩:X2130123 树桩:X320 树桩:X321301203102130
的最后两位数字X
是10
,因此下一位数字的唯一可能选择是2
和3
。选择2
会导致序列必须终止的情况。贪心算法将不会在这里工作。(无论如何也不是没有回溯的。)
n
,但是鉴于我的程序发现的树桩每次平均平均要长10位,因此我非常确定存在无限序列。我不确定如何针对任意大序列测试半贪婪算法。我可以将要求限制为n
= 1000,而不必担心更高的要求n
。
AA
真的键入ABA
哪里B
是空的。这也许有助于简化某些解决方案。
n
吗?如果有人给出启发式半贪婪算法,您将如何检查它在很长的时间内没有遇到问题?普遍的问题是一个有趣的问题,在避免模式的限制条件下,我无法找到任何东西,因为我们会限制部分模式的长度。如果有人可以制作一个通用的食谱,我希望这是最好的方法。