首先,对于一个人来说,只有他后面的
B
i
B_i
Bi个人有可能比他先吃完饭。具体谁先吃谁后吃,并不好递推。发现,
B
i
B_i
Bi是很小的,我们可以把点
i
i
i后面可能会影响答案的7个点的状态压成二进制数;每次处理的时候,当前状态肯定有一段连续的区间,1~i被处理过了;为了计算一个人所消耗的时间,我们还需要记录一下最近一次吃饭的是哪一位。
综上,我们定义状态
f
[
i
]
[
j
]
[
k
]
f[i][j][k]
f[i][j][k]表示到了第
i
i
i个人,前
i
−
1
i-1
i−1个人已经吃完饭,第
i
i
i个人以及后面7个人的吃饭状态为
j
j
j,最近一次吃饭的人距离
i
i
i为
k
k
k,此时的最小耗费时间。
那么转移就比较容易了:
此时第
i
i
i个人已经吃过饭,那后面的人吃饭顺序就和他没关系了,所以直接推:
f
[
i
+
1
]
[
j
>
>
1
]
[
k
−
1
]
=
m
i
n
(
f
[
i
+
1
]
[
j
>
>
1
]
[
k
−
1
]
,
f
[
i
]
[
j
]
[
k
]
)
f[i+1][j>>1][k-1]=min(f[i+1][j>>1][k-1],f[i][j][k])
f[i+1][j>>1][k−1]=min(f[i+1][j>>1][k−1],f[i][j][k])。