\(link\)
\(n\)個偶像排成一列,他們來自\(m\)個不同的樂隊。每個團隊至少有乙個偶像。
現在要求重新安排佇列,使來自同一樂隊的偶像連續的站在一起。重新安排的辦法是,讓若干偶像出列(剩下的偶像不動),然後讓出列的偶像乙個個歸隊到原來的空位,歸隊的位置任意。
請問最少讓多少偶像出列?\((1\le\le10^5,m\le20)\)
注意到全排列是過不去的,考慮狀壓。
設\(dp[i]\)表示\(i\)這個狀態(二進位制)下為\(1\)的樂隊都排好位置時最小的出隊人數。轉移就是由\(i\)中把乙個樂隊排到最後來轉移。然後用字首和來快速判斷一段區間內某一樂隊的偶像數量。
#include using namespace std;
int n, m, a[100005], dp[1050005], sum[100005][25], tot[25];
int read()
while (ch >= '0' && ch <= '9')
return x * fl;
}int main()
for (int i = 0; i <= (1 << m) - 1; i ++ )
printf("%d\n", dp[(1 << m) - 1]);
return 0;
}
Luogu P3694 邦邦的大合唱戰隊
題目傳送門 n 個人,分別屬於 m 個組,要求同組的人站在一起。每個人可以出隊,出隊後留出空位,出隊後的人可以在任意空位歸隊。求最少出隊人數。看到 m 的資料範圍極小,猜測可能是狀壓dp。但沒有想出來到底是如何狀壓,於是重新審視題意。可以發現,最後同組的人站在一起,一定會形成組的順序,例如 1111...
P3694 邦邦的大合唱站隊
bang dream 裡的所有偶像樂隊要一起大合唱,不過在排隊上出了一些問題。n個偶像排成一列,他們來自m個不同的樂隊。每個團隊至少有乙個偶像。現在要求重新安排佇列,使來自同一樂隊的偶像連續的站在一起。重新安排的辦法是,讓若干偶像出列 剩下的偶像不動 然後讓出列的偶像乙個個歸隊到原來的空位,歸隊的位...
題解 LuoGu3694 邦邦的大合唱站隊
原題傳送門 暗示明顯,狀壓dpdp dp狀態設計簡單,當前有多少樂隊已經排好隊為1,其餘為0,壓成二進位制iiid pi dp i dpi 表示狀態i ii的答案 本來還一直在想如何來是最優策略,突然靈機一動 我這不是dpdp dp嘛,那我萬一既然有了最優策略,我還d dd什麼呢 現在,只有最終狀態...