n
nn個人,有m
mm個隊伍,每個人都屬於乙個隊伍。要求叫出一些人來,然後任意插入出來的空隙中使得同一隊的人在一起。求最少出列人數。
如果知道最終的佇列就可以十分容易的計算答案了。考慮乙個乙個隊伍的放入最終序列中,因為m
mm十分的小,所以我們可以狀壓表示排好了的隊伍集合,然後用乙個字首和統計在乙個區域內每個隊伍的人數即可進行dpdp
dp。時間複雜度o(n
m+2m
m)
o(nm+2^mm)
o(nm+2
mm)
#include
#include
#include
using
namespace std;
int n,m,s[
110000][
20],wz[
1<<20]
,f[1
<<20]
;int
main()
int ms=
1
int i=
0;i)for
(int j=
0;j) wz[i]
+=s[n]
[j]*
((i>>j)&1
);memset
(f,0x3f
,sizeof
(f))
;f[0]=
0;for(
int i=
1;iprintf
("%d"
,f[ms-1]
);}
P3694 邦邦的大合唱站隊 狀壓DP
bang dream 裡的所有偶像樂隊要一起大合唱,不過在排隊上出了一些問題。n個偶像排成一列,他們來自m個不同的樂隊。每個團隊至少有乙個偶像。現在要求重新安排佇列,使來自同一樂隊的偶像連續的站在一起。重新安排的辦法是,讓若干偶像出列 剩下的偶像不動 然後讓出列的偶像乙個個歸隊到原來的空位,歸隊的位...
P3694 邦邦的大合唱站隊
bang dream 裡的所有偶像樂隊要一起大合唱,不過在排隊上出了一些問題。n個偶像排成一列,他們來自m個不同的樂隊。每個團隊至少有乙個偶像。現在要求重新安排佇列,使來自同一樂隊的偶像連續的站在一起。重新安排的辦法是,讓若干偶像出列 剩下的偶像不動 然後讓出列的偶像乙個個歸隊到原來的空位,歸隊的位...
P3694 邦邦的大合唱站隊 狀壓dp好題!!
題目 其實看這道題實際上就是列舉m個樂隊的排列,然後對應的站在該樂隊多佔的位置,卻不是該樂隊的人需要出隊。然後最後一定可站成同一團隊連續的排列。那麼下面的dp方程就很好理解啦。注意 從狀態s 在s後面放乙個樂隊j 一定需要增加的出隊的人數為 樂隊j所佔的容量num j 處不是樂隊j的人的個數。dp ...