洛谷P3694 邦邦的大合唱站隊 簽到題

2022-04-01 12:49:32 字數 1669 閱讀 8029

bang dream!裡的所有偶像樂隊要一起大合唱,不過在排隊上出了一些問題。

n個偶像排成一列,他們來自m個不同的樂隊。每個團隊至少有乙個偶像。

現在要求重新安排佇列,使來自同一樂隊的偶像連續的站在一起。重新安排的辦法是,讓若干偶像出列(剩下的偶像不動),然後讓出列的偶像乙個個歸隊到原來的空位,歸隊的位置任意。

請問最少讓多少偶像出列?

輸入格式:

第一行2個整數n,m。

接下來n個行,每行乙個整數a_i(1\le a_i \le m)ai​(1≤ai​≤m),表示佇列中第i個偶像的團隊編號。

輸出格式:

乙個整數,表示答案

輸入樣例#1: 複製

12 413

2421

2311

34

輸出樣例#1: 複製

7
【樣例解釋】

1  3   √

3 3

2 3 √

4 4

2 4 √

1 2 √

2 2

3 2 √

1 1

1 1

3 1 √

4 1 √

【資料規模】

對於20%的資料,n\le 20, m=2n≤20,m=2

對於40%的資料,n\le 100, m\le 4n≤100,m≤4

對於70%的資料,n\le 2000, m\le 10n≤2000,m≤10

對於全部資料,1\le n\le 10^5, m\le 201≤n≤105,m≤20

#includeconst

int n=100005,m=26

;int a[n],b[m],n,m,s[m],sum[m][n],ans=1

<<30

;bool

vis[m];

void dfs(int i, int

tot)

if(tot>ans) return

;

for(int j=1;j<=m;j++)

if(!vis[j])

}int

main()

for(int i=1;i<=m;i++)

for(int j=1;j<=n;j++)

dfs(

1,0);

printf("%d

",ans);

}

70分 暴力

/*

狀態壓縮,dp[i]表示達到i狀態出隊的最小人數,sum[i][j]表示前i個人有幾個屬於j樂隊那麼列舉乙個l,r則有dp[i|(1

#include

#include

using

namespace

std;

int n,m,dp[(1

<<20)+1],a[100010],sum[100010][21

];int

main()

}for(int i=0;i

<0x7fffffff;dp[0]=0

;

for(int i=0;i

}printf("%d

",dp[(1

<1

]);}

100分 狀壓dp

洛谷 P3694 邦邦的大合唱站隊

題目鏈結 m 很小,考慮狀壓。狀態 s 一共有 m 位,每一位代表當前樂隊是否排好 即樂隊所有成員都站在一起 並假設所有排好的樂隊都站在前面。f s 表示狀態為 s 時最少移動的偶像數目。不管所有排好的樂隊順序如何,它們的總數是一定的。列舉 s 狀態中的每乙個 0 如果將它變成 1 並接在所有排好的...

P3694 邦邦的大合唱站隊

bang dream 裡的所有偶像樂隊要一起大合唱,不過在排隊上出了一些問題。n個偶像排成一列,他們來自m個不同的樂隊。每個團隊至少有乙個偶像。現在要求重新安排佇列,使來自同一樂隊的偶像連續的站在一起。重新安排的辦法是,讓若干偶像出列 剩下的偶像不動 然後讓出列的偶像乙個個歸隊到原來的空位,歸隊的位...

洛谷 P3694 邦邦的大合唱站隊 狀壓DP

首先要注意合唱隊排好隊之後不一定是按 1.2.3.m 的順序的 n 的範圍很大,但 m 的資料比較小,所以我們考慮裝壓dp 我們設 f i 為狀態為 i 的合唱隊已經安排好位置的最小花費 接下來就是狀態轉移方程的問題 for int i 1 i 我們用乙個變數 len 記錄排好隊的總人數,如果當前合...