algorithm - 计算总组合

标签 algorithm discrete-mathematics

我不知道如何解决这个编程问题。

给定两个整数 n 和 m,存在多少个数字使得所有数字的所有数字都从 0 到 n-1,并且两个相邻数字之间的差正好为 1,并且该数字中的数字个数最多为 'm' .

解决这个问题的最佳方法是什么?有直接的数学公式吗?

编辑:数字不能以 0 开头。

例子: 对于 n = 3 和 m = 6,有 18 个这样的数字(210、2101、21012、210121 ... 等)

更新(有些人遇到过歧义): 所有 数字从 0 到 n-1 必须存在。

最佳答案

此 Python 代码通过跟踪以特定数字结尾的数字以 O(nm) 计算答案。

不同的数组(A、B、C、D)用于跟踪达到范围最大值或最小值的数字。

n=3
m=6
A=[1]*n # Number of ways of being at digit i and never being to min or max
B=[0]*n # number of ways with minimum being observed
C=[0]*n # number of ways with maximum being observed
D=[0]*n # number of ways with both being observed
A[0]=0 # Cannot start with 0
A[n-1]=0 # Have seen max so this 1 moves from A to C
C[n-1]=1 # Have seen max if start with highest digit
t=0
for k in range(m-1):
    A2=[0]*n
    B2=[0]*n
    C2=[0]*n
    D2=[0]*n
    for i in range(1,n-1):
        A2[i]=A[i+1]+A[i-1]
        B2[i]=B[i+1]+B[i-1]
        C2[i]=C[i+1]+C[i-1]
        D2[i]=D[i+1]+D[i-1]
    B2[0]=A[1]+B[1]
    C2[n-1]=A[n-2]+C[n-2]
    D2[0]=C[1]+D[1]
    D2[n-1]=B[n-2]+D[n-2]
    A=A2
    B=B2
    C=C2
    D=D2
    x=sum(d for d in D2)
    t+=x
print t

关于algorithm - 计算总组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18334599/

相关文章:

algorithm - 在不损失精度的情况下有效地逼近第 n 项

java - 如何知道不在一组数字中的最小值

c - 给定一个音频流,找到关门的时间(声压级计算?)

Python贪心算法

java - 联赛赛程的排列

java - 计算小于或等于 N 的两个数对的数量,使得对数的数字和为素数

algorithm - 求和函数证明它很大 oh 和 big theta

检查将两个数字的相应小数位相加是否在每个位置产生相同的值

algorithm - 如何计算使序列的所有元素彼此相等所需的最小操作次数

Python 集合运算——集合的补并集