算法 – 相邻比特计数

这是来自spoj的 problem状态

For a string of n bits x1,x2,x3,…,Xn
the adjacent bit count of the string
(AdjBC(x)) is given by

X1*X2 + X2*X3 + X3*X4 + … + Xn-1 *
Xn

which counts the number of times a 1
bit is adjacent to another 1 bit. For
example:

AdjBC(011101101) = 3
AdjBC(111101101) = 4
AdjBC(010101010) = 0

问题是:编写一个程序,它将整数n和k作为输入,并返回满足AdjBC(x)= k的n位(2位中的2位)的位串数x.

我不知道如何解决这个问题.你能帮帮我解决这个问题吗?

谢谢

解决方法

通常在组合问题中,有助于查看它产生的一组值.使用蛮力我计算了下表:

k   0   1   2   3   4   5   6
n +----------------------------
1 |   2   0   0   0   0   0   0
2 |   3   1   0   0   0   0   0
3 |   5   2   1   0   0   0   0
4 |   8   5   2   1   0   0   0
5 |  13  10   6   2   1   0   0
6 |  21  20  13   7   2   1   0
7 |  34  38  29  16   8   2   1

第一列是熟悉的Fibonacci序列,并且满足递归关系f(n,0)= f(n-1,0)f(n-2,0)

其他列满足递推关系f(n,k)= f(n – 1,k)f(n – 1,k – 1)f(n – 2,k) – f(n – 2,k – 1 )

有了这个,你可以做一些动态编程:

INPUT: n,k
row1 <- [2,...] (k+1 elements)
row2 <- [3,1,...] (k+1 elements)
repeat (n-2) times
  for j = k downto 1 do
    row1[j] <- row2[j] + row2[j-1] + row1[j] - row1[j-1]
  row1[0] <- row1[0] + row2[0]
  swap row1 and row2
return row2[k]

相关文章

文章浏览阅读903次。文章主要介绍了收益聚合器Beefy协议在币...
文章浏览阅读952次。比特币的主要思路是,构建一个无中心、去...
文章浏览阅读2.5k次。虚拟人从最初的不温不火,到现在步入“...
文章浏览阅读1.3k次,点赞25次,收藏13次。通过调查和分析用...
文章浏览阅读1.7k次。这个智能合约安全系列提供了一个广泛的...
文章浏览阅读1.3k次。本文描述了比特币核心的编译与交互方法...