基于某些条件的安全阵列分区

时间:2018-08-25 09:02:57

标签: algorithm dynamic-programming computer-science

我正在尝试解决this problem。问题可以概括为: 给定整数序列,则找不到安全分区,其中安全分区定义为:

安全分区是划分为子序列S1,S2,…,SK的分区,这样对于每个有效的imin(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上的某个地方找到包含代码的解决方案,但是我更着迷于寻找解决此问题的方法,所以我在这里问我观察中缺少哪些要点。

这些是我读到此问题时想到的事情:

  1. 如果索引为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是分区函数。 这个推理有效吗?我想念什么吗?

1 个答案:

答案 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 。然后我只需要通过归纳证明。