algorithm - 确定有多少个不同的数组是可能的

标签 algorithm combinatorics

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

最佳答案

Ti 为满足您的条件且以 1 结尾的长度为 i 的数组的数量, 并令 Fi 为满足您的条件的长度为 i 的数组的数量,并执行 1 结尾。

然后:

  • T0 = 0
  • F0 = 1
  • Ti+1 = Fi。 (每个满足您的标准并以 1 结尾的长度 i+1 的数组都包含满足您的标准但的长度i 的数组> 以 1 结尾,最后加上额外的 1。)
  • Fi+1 = Fi + Ti。 (每个长度 i+1 的数组满足您的标准并且1 结尾,由一个长度 i 的数组组成,满足您的标准,最后加上一个额外的 0。)
  • 你想要FX + TX.

所以你可以只写一个循环来计算 FiT i 对从 0 到 X 的每个 i,然后返回 FX + TX

(这本身就不是动态规划,因为您不需要存储部分值;Fi+1Ti+1 仅取决于 Fi/sub> 和 Ti。所以这是 O(X) 时间和 O(1) 个空间。)

关于algorithm - 确定有多少个不同的数组是可能的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53453099/

相关文章:

algorithm - 递归函数中的基本和递归情况

c# - 在内存中保存大型可编辑文档的最佳方法

algorithm - 0..N 中输入的平均间隔数

c# - 如何理解以下实现算法的 C# linq 代码以返回 n 中 k 元素的所有组合

algorithm - 生成 n 集的所有 k 子集的最有效算法是什么?

math - 如何查找具有以下约束的二进制数的个数:

algorithm - 正确排列括号的方法数

algorithm - 遍历任意树结构中的每条唯一路径(从根到叶)

java - 学习元素排序的算法(最好在 Java 中)

python - 第 k 个排列的第 i 个元素