Algorithm 确定可以使用多少不同的阵列

Algorithm 确定可以使用多少不同的阵列,algorithm,combinatorics,Algorithm,Combinatorics,假设我们有一个长度为X的布尔数组。唯一的规则是,TRUE不能在相邻位置出现两次。尤其是只允许使用假值的数组。例如,这是禁止的:[1,1,0,0,0]并且这些是允许的:[1,0,0,0,0],[0,0,0,0],[1,0,1,0,1]等等。我如何使用动态规划来确定长度X有多少个不同的有效数组?我认为您可以不使用DP来计算这个数字。因为您知道长度为N的数组总数,所以它是'2^N' 现在您需要扣除那些不符合条件的坏的数组,如果它们有相邻的1。对于长度为N的数组,有以下情况 1. the array h

假设我们有一个长度为X的布尔数组。唯一的规则是,TRUE不能在相邻位置出现两次。尤其是只允许使用假值的数组。例如,这是禁止的:[1,1,0,0,0]并且这些是允许的:[1,0,0,0,0],[0,0,0,0],[1,0,1,0,1]等等。我如何使用动态规划来确定长度X有多少个不同的有效数组?

我认为您可以不使用DP来计算这个数字。因为您知道长度为N的数组总数,所以它是'2^N'

现在您需要扣除那些不符合条件的
坏的
数组,如果它们有相邻的
1
。对于长度为N的数组,有以下情况

1. the array has no 1's, only one case, and it is a valid array
2. the array has one 1's, all cases are valid
3. the array has two 1's, there are N - 1 cases which are not valid
4. the array has three 1's, there are (N-1) * (N-2) / 2 cases which are not valid

设Ti为满足标准且以
1
结尾的长度为i的数组数,设Fi为满足标准且不以
1
结尾的长度为i的数组数

然后:

  • T0=0
  • F0=1
  • Ti+1=Fi。(每个长度为i+1且符合您的标准并以
    1
    结尾的数组由一个长度为i且不以
    1
    结尾的数组组成,最后再加上一个额外的
    1
    。)
  • Fi+1=Fi+Ti。(每个长度为i+1且符合您的标准且不以
    1
    结尾的数组由一个长度为i且符合您的标准的数组组成,最后加上一个额外的
    0
    。)
  • 你想要FX+TX
所以你可以写一个循环,计算从0到X的每个i的Fi和Ti,然后返回FX+TX


(这本身甚至不是动态规划,因为不需要存储部分值;Fi+1和Ti+1仅依赖于Fi和Ti。因此这是O(X)时间和O(1)空间。)

dp解决方案将有两个状态参数。一个是数组的位置,另一个是前一个位置的值。如果上一个位置的值为1,则只能选择0。如果上一个位置的值为0,则可以选择1或0。希望这有帮助

您并不真正需要动态编程。 对于数组长度X,有效数组的数目是Fib(X+1),其中Fib是fibonacci数的数组

X=1:有效数组:2

X=2:有效数组:3

X=3:有效数组:5

X=4:有效数组:8

等等

演示:

假设我们正在寻找X的数组,并且知道X-1的有效数组数。我们可以在每个X-1长度数组的末尾自由添加一个零,到目前为止,这就是F(X-1)。我们还可以在每个以0结尾的X-1数组的末尾添加一个“1”。但这些阵列有多少?这就是F(X-2),因为我们可以用同样的方法生成以零结尾的X-1长度数组:在每个X-2长度数组的末尾添加一个零。所以F(X)=F(X-1)+F(X-2) 这就是斐波那契数组的定义

我们所要做的就是手动计算前两个元素,确定它到底是斐波那契数组还是移位


你甚至可以找到一个公式来计算斐波那契数组的第n个元素,这样它就可以在O(1)中求解。

那么澄清一下:你的意思是
1
不允许出现在两个连续的元素中?你到目前为止做了什么?@jamesdlin确切地说也不会T0=1,因为其中没有连续的1?@saketk21:对不起,我不明白你的问题。(你的代词“it”指的是什么?)我所困惑的是基本情况。为什么T0=0和F0=1?因为它们的长度都是0,所以它们都应该是0。如果你认为长度1是基本情况,那么它们都应该是1,因为可能的数组是0和1,即T1=1和F1=1。@ SAKETK21:你问为什么空数组<代码> []/COD>不在<代码> 1 < /代码>中结束?还是你在问我为什么选择定义Tᵢ 由于只计算以
1
结尾的数组,您最近的评论帮助我弄清楚了这一点。我将F误解为长度I以0结尾的数组数,而不是以1结尾的数组数,这意味着空数组也被计算在F中。我们必须假设,对于OP来说,了解你是如何得出答案而不仅仅是知道答案是很重要的。如果你指的是Binet的第n个fibonacci数公式,那么这只是一个近似值,不是正确的结果。n次斐波那契数最多只能用O(logn)来计算,这行不通。例如,在长度为5, 2个连续数组的情况下,您考虑的是11xxx、x11xx、xx11x和xxx11。但是,x仍然可以取值0或1(除了在连续1个数较多的情况下处理的情况),我认为这是可行的。例如,N=5。案例1和案例2均有效。案例3将有4个无效案例。案例4将有4*3/2=6个无效案例。案例5 4*C(4,2)/3!=无效病例8例。案例6将有1个无效案例。所以它是2^5-(1+4+6+8)=13