为更好地解决这个问题,
- 令
A
为利润矩阵,其中A[c]
是城市c
的利润数组(对于第一个城市,第二个城市等等)。
- 令
P(i, c)
为包括第i
天在内,在第i
天结束时搬家公司位于城市c
的最佳利润。
- 令
C(c', c)
是从城市c'
到城市c
的移动成本。
这种设置使我们能够将解决方案推广到任意数量的城市。
为了最大化P(i, c)
,我们必须考虑搬家工人可能在前一天处于的所有城市,并选择最大的选项。这些可能性包括搬家工人在前一天在同一个城市,以及从另一个城市移动前一天,并承担搬家成本。因此
P(i, c) = max(P(i-1, c), max(P(i-1, c') + C(c', c) for all cities c' != c)) + A[c][i]
外层 max
的第一个参数 (P(i-1, c)
) 考虑了搬家工人在前一天在同一城市的情况,而第二个参数(内层的 max
)计算并最大化了利润(包括搬家费用),如果搬家工人前一天在另一个城市。
最终答案就是 max(P(n, x) for all cities x)
,其中 n
是最后一天(考虑所有可能的城市,搬家工人可能在最后一天结束时停留在哪里)。
在你的例子中,城市 A == 城市 0,城市 B == 城市 1,利润矩阵 A = [[10, 20, 30], [-10, 50, 20]]
,且 C(0, 1) = C(1, 0) = 20
。
编辑:
时间复杂度为 O(nc)
,其中 n
是天数,c
是城市数量。如果城市数量固定,则时间复杂度为 O(n)
。
使用归纳法可以证明正确性。假设对于所有城市 x
,P(i-1, x)
都是最大的。然后证明对于一些城市 c
,根据上述定义的 P(i, c)
最大。最大解有两种可能:
- 在第
i-1
天,搬家工人在城市 c
中
- 在第
i-1
天,搬家工人在城市 c'
中
现在您需要证明,递归定义将在这两种情况下都给出正确的解。