我正在尝试解决this problem。问题可以概括为: 给定整数序列,则找不到安全分区,其中安全分区定义为:
安全分区是划分为子序列S1,S2,…,SK
的分区,这样对于每个有效的i
,min(Si)≤|Si|≤max(Si)
-即,对于该分区中的每个子序列,其长度都大于或等于它的最小元素,小于或等于其最大元素。
例如:
Input => 1 6 2 3 4 3 4
Output => 6 partitions
[1],[6,2,3,4,3,4]
[1,6,2],[3,4,3,4]
[1,6,2,3],[4,3,4]
[1],[6,2],[3,4,3,4]
[1],[6,2,3],[4,3,4]
[1,6],[2,3],[4,3,4]
我可能可以在Internet上的某个地方找到包含代码的解决方案,但是我更着迷于寻找解决此问题的方法,所以我在这里问我观察中缺少哪些要点。
这些是我读到此问题时想到的事情:
i
的元素安全地扩展了序列,
也可能是新序列的开始。
每个元素i
都有两个选择是否扩展
是否排序。所以我认为它可以用数学表示为
p(0..N)=1+P(i..N)+P(i+1..N),if A[i] is safe to extend current partition
p(0..N)=1+ p(i..N), if A[i] can't be used to extend
其中P
是分区函数。
这个推理有效吗?我想念什么吗?
答案 0 :(得分:1)
[我很难在没有给出解决方案的情况下给出方向,因为一旦一个人朝着正确的方向思考,那么解决方案就变得显而易见。我将着重强调一些可能使一个人走上正轨的事实。]
明确枚举安全分区是有问题的,因为存在O(2 n )个安全分区。例如:
1,N,1,N,1,N ... [N elements]
对于此序列,在任何长度> 1的子序列上,且子序列[1]均符合条件。这种长度为n = 2k的序列的安全分区数为3 k-1 。为了证明这一点,请查看以下
基本k = 1:f(1)= f(2)= 1
步骤假设:f(2k)= 3 k-1 。
f(2k + 1)=
f(2k + 2)=(f(2k)+ f(2k-1))+(f(2k-2)+ f(2k-3))+ ... + f(1)+1
= 2 *(f(2k)+ f(2k-2)+ .. + f(2))+ 1
= 2 *(3 k-1 + 3 k-2 + ... + 1)+ 1
= 2 *(3 k -1)/ 2 + 1
= 3 k
由于不可能进行枚举,因此对于任何合理的性能,解决方案都必须以某种方式计数而不进行迭代。由于1,N,...,1,N具有3 k-1 的证明不必明确列举所有序列,因此其原理可以推广到任何序列。
注意:
我以前已经解决过类似的问题,所以对我来说方向很明确。对于这个问题,我试图将我的想法分解为易于管理的想法,并提出了关于复杂性的想法。我非常强烈地感觉到,即使在写下并尝试证明它之前,它都是指数级的。这来自经验和其他问题。复杂度函数比Fibbonacci差,因为向序列中添加元素似乎要添加至少两个较小大小的元素(类似于Fibbonacci序列)。由于Fibbonacci是指数的,因此1,...,1分区必须是指数的。从那里继续并用递归关系对其进行了分析。
我到达解决方案的确切方式与我的想法相符。每个人都有适合他们的不同思维方式,他们需要发展并找到它。
这就是我怀疑tge示例中的安全序列数为3 k-1 的原因:
我以基本条件f(1)= f(2)= 1递归计算f(2k)。然后是3:
[1,N,1]
[1],[N,1]
[1,N],[1]
对于4:
[1,N,1,N]
[1],[N,1,N]
[1,N],[1,N]
意思是f(3)= f(4)= 3。然后我递归应用
f(2k + 2)= 2 *(f(2k)+ f(2k-2)+ .. + f(2))+1
导致f(2)= 1,f(4)= 3,f(6)= 9,f(8)= 27。看起来像是3 k-1 。然后我只需要通过归纳证明。