假设我们有一个长度为 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子>.
所以你可以只写一个循环来计算 Fi 和 T i 对从 0 到 X 的每个 i,然后返回 FX + TX。
(这本身就不是动态规划,因为您不需要存储部分值;Fi+1 和 Ti+1 仅取决于 Fi/sub> 和 Ti。所以这是 O(X) 时间和 O(1) 个空间。)
关于algorithm - 确定有多少个不同的数组是可能的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53453099/