假设你有一个在n维欧几里得空间中起点为原点P_0
=(0,0,...,0)
的舞蹈机器人。
这个机器人可以执行m种不同的舞蹈动作D_1, D_2, ..., D_m
。
D_i
是一个由n个整数组成的向量(D_i_1, D_i_2, ..., D_i_n)
。
如果机器人执行了第i个舞蹈动作,它的位置将会发生改变:
P_{t+1} = P_t + D_i
机器人可以随意多次执行任何一种舞蹈动作,并且可以按照任意顺序执行。
定义一个k-dance为k个舞蹈动作的序列。
很明显,总共有m^k
种可能的k-dances。
我们想知道所有可能的k-dance结束时的位置集合,并且对于每个结束位置,有多少个k-dance在该位置结束。
一种实现方法如下:
P0 = (0, 0, ..., 0);
S[0][P0] = 1
for I in 1 to k
for J in 1 to m
for P in S[I-1]
S[I][P + D_J] += S[I][P]
现在,S[k][Q]
将会告诉你有多少个 k-dances 结束于位置 Q。
假设 n
、m
、|D_i|
都很小(小于 5),并且 k
小于 40。
有没有更快的方法?我们能否通过一些线性代数相关技巧或其他方法“直接”计算 S[k][Q]
呢?