邦邦的大合唱站队

Posted hrj1

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了邦邦的大合唱站队相关的知识,希望对你有一定的参考价值。

题目背景

BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题。

题目描述

N个偶像排成一列,他们来自M个不同的乐队。每个团队至少有一个偶像。

现在要求重新安排队列,使来自同一乐队的偶像连续的站在一起。重新安排的办法是,让若干偶像出列(剩下的偶像不动),然后让出列的偶像一个个归队到原来的空位,归队的位置任意。

请问最少让多少偶像出列?

输入格式

第一行2个整数N,M。

接下来N个行,每行一个整数a_i(1\le a_i \le M)ai?(1ai?M),表示队列中第i个偶像的团队编号。

输出格式

一个整数,表示答案

输入输出样例

输入 #1
12 4
1
3
2
4
2
1
2
3
1
1
3
4
输出 #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=2N20,M=2

对于40%的数据,N\le 100, M\le 4N100,M4

对于70%的数据,N\le 2000, M\le 10N2000,M10

对于全部数据,1\le N\le 10^5, M\le 201N105,M20

 

 

状压DP。。。。。。

 

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;

long long int n,m,i,j,a[1000005];

long long int ans=0,sum[250],er[1000005],t,l,best[2000005],num[25][1000005],k;

inline long long int read()
    long long int s=0,w=1;
    char ch=getchar();
    while(ch<0||ch>9)
        if(ch==-)
            w=-1;
        
        ch=getchar();
    
    while(ch>=0&&ch<=9)
        s=s*10+ch-0;
        ch=getchar();
    
    return s*w;



int main()
    n=read();
    m=read();
    for(i=1;i<=n;i++)
        a[i]=read();
        sum[a[i]]++;
    
    er[1]=1;
    for(i=2;i<=m;i++)
        er[i]=er[i-1]*2;
    
    for(j=1;j<=m;j++)
        t=0;
        for(i=1;i<=n;i++)
            if(a[i]==j)
                t++;
            
            if((i>sum[j])&&(a[i-sum[j]]==j))
                t--;
            
            if(i>=sum[j])
                num[j][i-sum[j]+1]=t;
            
        
    
    l=(1<<m)-1;
    memset(best,127,sizeof(best));
    best[0]=0;
    for(i=0;i<=l;i++)
        k=0;
        for(j=1;j<=m;j++)
            if(er[j]&i)
                k+=sum[j];
            
        
        for(j=1;j<=m;j++)
            if((er[j]&i)==0)
                best[i+er[j]]=min(best[i+er[j]],best[i]+sum[j]-num[j][k+1]); 
            
        
    
    printf("%lld",best[l]);
    return 0;

 

以上是关于邦邦的大合唱站队的主要内容,如果未能解决你的问题,请参考以下文章

P3694 邦邦的大合唱站队/签到题(状压dp)

Luogu3694 邦邦的大合唱站队 (状压DP)

[luoguP3694] 邦邦的大合唱站队/签到题(状压DP)

Luogu P3694 邦邦的大合唱站队 状压dpBy cellur925

DP杂题2

洛谷P3694 邦邦的大合唱