原題傳送門
暗示明顯,狀壓dpdp
dp狀態設計簡單,當前有多少樂隊已經排好隊為1,其餘為0,壓成二進位制iiid
pi
dp_i
dpi
表示狀態i
ii的答案
本來還一直在想如何來是最優策略,突然靈機一動
我這不是dpdp
dp嘛,那我萬一既然有了最優策略,我還d
dd什麼呢
現在,只有最終狀態下樂隊的相對位置會影響答案大小
d pdp
dp的時候按照列舉樂隊順序從左到右放置樂隊
令s um
i,
jsum_
sumi,j
表示1~j個人中有幾個是第i的樂隊的
d pj
∣(
1<
<—dp
j+(r
−l+1
)−(s
umi,
r−su
mi,l
−1
)dp_{j|(1j∣(1
<
<—dp
j+(
r−l+
1)−(
sumi
,r−
sumi
,l−1
)其中l−1
=∑i=
1msu
mi,n
((11=i=
1∑m
sumi
,n(
(1<)
code:
//我也不知道我是腦抽了還是怎麼了,心血來潮寫個pascal
uses math;
var n, m, x, l, r, i, j : longint;
power : array[
0..25
] of longint;
sum : array[
0..21,0.
.2000010
] of longint;
dp : array[
0..2000010
] of longint;
begin
readln
(n, m)
;for i :
=1 to n do
begin
readln
(x);
for j :
=1 to m do
sum[j]
[i]:
= sum[j]
[i -1]
;inc
(sum[x]
[i])
; end;
power[0]
:=1;
for i :
=1 to 20
do power[i]
:= power[i -1]
<<1;
for i :
=1 to power[m]-1
do dp[i]
:= maxlongint div 2
;for i :
=0 to power[m]-1
do begin
l :=0
;for j :
=1 to m do
if(i and power[j -1]
<
>
0) then inc
(l, sum[j]
[n])
;for j :
=1 to m do
if(i and power[j -1]
=0) then
dp[i or power[j -1]
]:=min
(dp[i or power[j -1]
], dp[i]
+ sum[j]
[n]- sum[j]
[l + sum[j]
[n]]
+ sum[j]
[l])
; end;
writeln
(dp[power[m]-1
]);end.
Luogu P3694 邦邦的大合唱戰隊
題目傳送門 n 個人,分別屬於 m 個組,要求同組的人站在一起。每個人可以出隊,出隊後留出空位,出隊後的人可以在任意空位歸隊。求最少出隊人數。看到 m 的資料範圍極小,猜測可能是狀壓dp。但沒有想出來到底是如何狀壓,於是重新審視題意。可以發現,最後同組的人站在一起,一定會形成組的順序,例如 1111...
Luogu P3694 邦邦的大合唱站隊
link n 個偶像排成一列,他們來自 m 個不同的樂隊。每個團隊至少有乙個偶像。現在要求重新安排佇列,使來自同一樂隊的偶像連續的站在一起。重新安排的辦法是,讓若干偶像出列 剩下的偶像不動 然後讓出列的偶像乙個個歸隊到原來的空位,歸隊的位置任意。請問最少讓多少偶像出列?1 le le10 5,m l...
P3694 邦邦的大合唱站隊
bang dream 裡的所有偶像樂隊要一起大合唱,不過在排隊上出了一些問題。n個偶像排成一列,他們來自m個不同的樂隊。每個團隊至少有乙個偶像。現在要求重新安排佇列,使來自同一樂隊的偶像連續的站在一起。重新安排的辦法是,讓若干偶像出列 剩下的偶像不動 然後讓出列的偶像乙個個歸隊到原來的空位,歸隊的位...