想象一下,你在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
比其位置改变D_i
:
P_{t+1} = P_t + D_i
机器人可以按照自己的意愿和任何顺序进行任何次数的舞蹈动作。
将 k-dance 定义为k舞蹈动作的序列。
显然,有m^k
可能的k-dances。
我们有兴趣知道k-dance的可能结束位置的集合,并且对于每个结束位置,有多少k-dances在该位置结束。
执行此操作的一种方法如下:
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]
“?或其他一些方法?
答案 0 :(得分:1)
您可以创建一个邻接矩阵,其中包含空间中的舞蹈移动过渡(它在k中可以到达的部分移动,否则它将是无限的)。然后,该矩阵的第n个幂的P_0行包含S [k]值。
有问题的矩阵很快变得庞大,类似于(k*(max(D_i_j)-min(D_i_j)))^n
(如果Q接近原点,每个维度可以减半),但对于S
矩阵也是如此
答案 1 :(得分:1)
由于1维问题与subset sum problem密切相关,你可能采取类似的方法 - 找到所有加在一起的舞蹈矢量组合,以获得正确的第一个坐标,恰好是k个动作;然后获取组合的子集并检查其中哪一个具有第二个的正确总和,并采用与两者匹配的子集并检查第三个,依此类推。
通过这种方式,您至少只需要为非常痛苦的O(n ^ k)步骤执行非常简单的添加。它确实会找到所有会达到给定值的向量。
答案 2 :(得分:1)
由于舞蹈动作是可互换的,你可以假设对于i < j
,机器人首先在D_i
移动之前进行所有D_j
动作,从而减少实际计算的组合数量。
如果你跟踪每次舞蹈动作的次数,计算组合的总数应该很容易。