在Python中查找数量严格递增的彩色蜡烛序列

在Python中查找数量严格递增的彩色蜡烛序列

假设有n个蜡烛从左到右排列。从左侧第i个蜡烛的高度为h[i],颜色为c[i]。我们还有一个整数k,表示颜色的范围在1到k之间。我们要找出有多少种严格递增的彩色蜡烛序列?递增序列是根据高度检查的,序列被称为彩色的,如果在1到K的颜色范围内至少有一支蜡烛可用。如果答案太大,则返回结果模10 ^ 9 + 7。

因此,如果输入如下:K= 3 ,h = [1,3,2,4],c = [1,2,2,3],则输出将为2,因为它有序列[1,2,4]和[1,3,4]。

要解决此问题,我们将遵循以下步骤 –

  • 定义一个函数read()。这将采取T,i
  • s:=0
  • 当i > 0时,执行以下操作
    • s:= s + T[i]
    • s:= s mod 10 ^ 9 + 7
    • i:= i – (i AND – i)
  • 返回s
  • 定义一个函数update()。这将采取T,i,v
  • 当i <= 50010时,执行以下操作
    • T[i]:= T[i] + v
    • T[i]:= T[i] mod 10 ^ 9 + 7
    • i:= i + (i AND – i)
  • 返回v
  • 从主方法中执行以下操作 –
  • L:= 2 ^ k,R:= 0,N:= h的大小
  • 对于范围0到L-1的i,执行以下操作
    • T:=大小为50009的数组,并填充为0
    • t:=0
    • 对于范围0到N-1的j,执行以下操作
      • 如果(将c[j] – 1次向右移位i)为奇数,则
      • t:= t + update(T,h[j],read(T,h[j] – 1)+1)
      • t:= t mod 10 ^ 9 + 7
    • 如果i中的位数模2与k模2相同,则
      • R:= R + t
      • R:= R mod 10 ^ 9 + 7
    • 否则,
      • R:=(R + 10 ^ 9+7)- t
      • R:= R mod 10 ^ 9 + 7
  • 返回R

示例

看下面的实现以更好地理解 –

def solve(k, h, c):
    def read(T, i):
        s = 0
        while i > 0:
            s += T[i]
            s %= 1000000007
            i -= (i & -i)
        return s

    def update(T, i, v):
        while i <= 50010:
            T[i] += v
            T[i] %= 1000000007
            i += (i & -i)
        return v

    def number_of_bits(b):
        c = 0
        while b:
            b &= b - 1
            c += 1
        return c

    L = 2 ** k
    R = 0
    N = len(h)

    for i in range(L):
        T = [0 for _ in range(50010)]
        t = 0

        for j in range(N):
            if (i >> (c[j] - 1)) & 1:
                t += update(T, h[j], read(T, h[j] - 1) + 1)
                t %= 1000000007

        if number_of_bits(i) % 2 == k % 2:
            R += t
            R %= 1000000007
        else:
            R += 1000000007 - t
            R %= 1000000007
    return R

k = 3
h = [1,3,2,4]
c = [1,2,2,3]

print(solve(k, h, c))

输入

3, [1,3,2,4], [1,2,2,3]

输出

2

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程