題目
其實看這道題實際上就是列舉m個樂隊的排列,然後對應的站在該樂隊多佔的位置,卻不是該樂隊的人需要出隊。然後最後一定可站成同一團隊連續的排列。那麼下面的dp方程就很好理解啦。
注意:從狀態s 在s後面放乙個樂隊j 一定需要增加的出隊的人數為 樂隊j所佔的容量num[j]處不是樂隊j的人的個數。
//dp[d]=dp[s]+cnt[j]-(s[r][j]-s[l][j]); r=len+cnt[j],l=len;
//dp[s]:狀態為s(已經排列好了的樂隊可以用狀態s表示)
//cnt[j]:第j個樂隊的人數
//num[i][j]:剛開始時(即輸入) 前i個人是第j個樂隊的人數
#include
using
namespace std;
const
int n=
1e5+
5,m=
21,inf=
0x3f3f3f3f
;int cnt[n]
,num[n]
[m],dp[
1<
;int
main()
}printf
("%d\n"
,dp[t-1]);}
P3694 邦邦的大合唱站隊 狀壓dp
n nn個人,有m mm個隊伍,每個人都屬於乙個隊伍。要求叫出一些人來,然後任意插入出來的空隙中使得同一隊的人在一起。求最少出列人數。如果知道最終的佇列就可以十分容易的計算答案了。考慮乙個乙個隊伍的放入最終序列中,因為m mm十分的小,所以我們可以狀壓表示排好了的隊伍集合,然後用乙個字首和統計在乙個...
P3694 邦邦的大合唱站隊 狀壓DP
bang dream 裡的所有偶像樂隊要一起大合唱,不過在排隊上出了一些問題。n個偶像排成一列,他們來自m個不同的樂隊。每個團隊至少有乙個偶像。現在要求重新安排佇列,使來自同一樂隊的偶像連續的站在一起。重新安排的辦法是,讓若干偶像出列 剩下的偶像不動 然後讓出列的偶像乙個個歸隊到原來的空位,歸隊的位...
P3694 邦邦的大合唱站隊
bang dream 裡的所有偶像樂隊要一起大合唱,不過在排隊上出了一些問題。n個偶像排成一列,他們來自m個不同的樂隊。每個團隊至少有乙個偶像。現在要求重新安排佇列,使來自同一樂隊的偶像連續的站在一起。重新安排的辦法是,讓若干偶像出列 剩下的偶像不動 然後讓出列的偶像乙個個歸隊到原來的空位,歸隊的位...