70分做法:枚举每个学校顺序,暴力。
100分:状压dp。从队列头到尾DP,
状态:f[i]表示i状态下最小的出列(不一致)的个数。
比如f[1101]表示从头到位为1/3/4乐队的偶像的最小出列个数。
f
[
i
]
=
m
i
n
(
f
[
i
x
o
r
2
j
]
+
n
u
m
[
j
]
−
(
s
u
m
[
l
e
n
g
t
h
]
[
j
]
−
s
u
m
[
l
e
n
g
t
h
−
n
u
m
[
j
]
]
[
j
]
)
)
;
f[i]=min(f[i xor 2 ^j ]+num[j]−(sum[length][j]−sum[length−num[j]][j]));
f[i]=min(f[ixor2j]+num[j]−(sum[length][j]−sum[length−num[j]][j]));
j表示团队编号,sum表示某种团队的前缀和,length表示到此已经排到的长度。