bang dream!裡的所有偶像樂隊要一起大合唱,不過在排隊上出了一些問題。
n個偶像排成一列,他們來自m個不同的樂隊。每個團隊至少有乙個偶像。
現在要求重新安排佇列,使來自同一樂隊的偶像連續的站在一起。重新安排的辦法是,讓若干偶像出列(剩下的偶像不動),然後讓出列的偶像乙個個歸隊到原來的空位,歸隊的位置任意。
請問最少讓多少偶像出列?
輸入格式:
第一行2個整數n,m。
接下來n個行,每行乙個整數a_i(1\le a_i \le m)ai(1≤ai≤m),表示佇列中第i個偶像的團隊編號。
輸出格式:
乙個整數,表示答案
輸入樣例#1: 複製
12 413輸出樣例#1: 複製2421
2311
34
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
#includeconst70分 暴力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);
}
/*100分 狀壓dp狀態壓縮,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
]);}
洛谷 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 記錄排好隊的總人數,如果當前合...