如何计算(弱)递减数字序列的数量?

时间:2016-08-07 08:42:56

标签: algorithm counting

我想解决没有循环的问题。假设我们有N个位置,并且对于每个地方,您可以选择[p,q]之间的数字,但是i + 1的数字应该小于或等于i的数字。现在如何在没有暴力的情况下计算所有可能的字符串。

例如假设我们有2个位置,您可以选择[2,3]之间的数字,然后可能的序列可以是:

3 3

3 2

2 2

由于地点数量不受限制,因此无法用简单的循环解决它。

1 个答案:

答案 0 :(得分:0)

选择(q-p + N,N),其中choose是二项式系数。

p和q之间的弱减少序列与0和s长度为q-p + N的序列进行双射,其中序列恰好具有N个序列。很明显,这些序列的数量是选择的(q-p + N,N),因为这是从q-p + N事物中选择N个事物的方式的数量。

证明这两组是双射

给定序列xs为0和1且长度为q-p + N且具有N 1> s,该伪代码在p和q之间产生弱减少的数字序列:

 c = q
 for x in xs
     if x = 1 then output c
     if x = 0 then c <- c - 1

相反,给定p和q之间长度为N的弱xs序列xs,该伪代码产生0和f的序列,长度为q-p + N且恰好为N 1&#39;第

 c = q
 while xs is not empty
     if c = head(hs) then
         output 1
         xs <- tail(xs)
     else
         output 0
         c <- c - 1
 while c > p
     output 0
     c <- c - 1

此处head(xs)表示xs列表中的第一个内容,tail(xs)表示列表的其余部分。