题目描述

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

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

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

解析

有点难。

定义二进制状态\(i\)表示自右往左第\(j\)位二进制数为第\(j\)个团队排队状态,其中1表示排好,0反之。

我们不妨大胆假设对于状态\(i\),这些排好的团队就都站在最前面,那么没排好的团队就只能站在她们后面,我们遍历所有没排好队的团队,接在排好队的后面。仔细考察,会发现如此定义也可以遍历整个状态空间,是可行的。

设\(dp[i]\)表示状态\(i\)时,假设排好队的所有团队都站在最前面出列的最少人数。对于这个状态\(i\),它可以从所有满足一个条件的它的子集转移而来,即其子集中某个团队未排好队的状态。

首先,对于一个状态\(i\),总人数不变,那么对于排在最后的一个团队的位置我们也就知道了。

对于一个转移,要让没排好队的那一个团队的人排好队,它会造成所有不属于这个团队的人出队。

预处理出每个团队的人的前缀和进行一个小小的优化即可轻松A掉这道题。

参考代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<string>
#include<cstdlib>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define N 100010
#define MOD 2520
#define E 1e-12
using namespace std;
inline int read()
{
int f=1,x=0;char c=getchar();
while(c<'0'||c>'9'){if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){x=x*10+c-'0';c=getchar();}
return x*f;
}
int sum[21][N],n,m,dp[N*20];
int main()
{
n=read(),m=read();
for(int i=1;i<=n;++i){
int x=read();
for(int j=1;j<=m;++j) sum[j][i]=sum[j][i-1];
sum[x][i]++;
}
memset(dp,0x3f,sizeof(dp));
dp[0]=0;
for(int i=0;i<=(1<<m)-1;++i){
int tmp=0;
for(int j=1;j<=m;++j)
if((i>>(j-1))&1) tmp+=sum[j][n];//该团队已经排好
for(int j=1;j<=m;++j){
if((i>>(j-1))&1) continue;
int l=tmp,r=tmp+sum[j][n];//没排好的这个团队要排到的位置
dp[i|1<<(j-1)]=min(dp[i|1<<(j-1)],dp[i]+r-l-sum[j][r]+sum[j][l]);
}
}
printf("%d\n",dp[(1<<m)-1]);
return 0;
}

*P3694 邦邦的大合唱站队[dp]的更多相关文章

  1. 状压DP 【洛谷P3694】 邦邦的大合唱站队

    [洛谷P3694] 邦邦的大合唱站队 题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶 ...

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

    P3694 邦邦的大合唱站队/签到题 题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶 ...

  3. 洛谷P3694 邦邦的大合唱站队/签到题

    P3694 邦邦的大合唱站队/签到题 题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶 ...

  4. P3694 邦邦的大合唱站队 (状压DP)

    题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶像. 现在要求重新安排队列,使来自同一 ...

  5. 洛谷P3694 邦邦的大合唱站队【状压dp】

    状压dp 应用思想,找准状态,多考虑状态和\(f\)答案数组的维数(这个题主要就是找出来状态如何转移) 题目背景 \(BanG Dream!\)里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. ...

  6. Luogu P3694 邦邦的大合唱站队 【状压dp】By cellur925

    题目传送门 最开始学状压的时候...学长就讲的是这个题.当时对于刚好像明白互不侵犯和炮兵阵地的我来说好像在听天书.......因为我当时心里想,这又不是什么棋盘,咋状压啊?!后来发现这样的状压多了去了 ...

  7. 洛谷 P3694 邦邦的大合唱站队 状压DP

    题目描述 输入输出样例 输入 #1 复制 12 4 1 3 2 4 2 1 2 3 1 1 3 4 输出 #1 复制 7 说明/提示 分析 首先要注意合唱队排好队之后不一定是按\(1.2.3..... ...

  8. P3694 邦邦的大合唱站队

    题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶像. 现在要求重新安排队列,使来自同一 ...

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

    传送门 来自kkk的题解: 70分做法:枚举每个学校顺序,暴力. 100分:状压dp.从队列头到尾DP, 状态:f[i]表示i状态下最小的出列(不一致)的个数. 比如f[1101]表示从头到位为1/3 ...

随机推荐

  1. Navicat连接Mysql8.0.11出现1251错误

    # 登录mysql mysql -u root -p # 修改加密规则 mysql> ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_pas ...

  2. snapde的批量文件数据过滤保存功能

    一.snapde基本介绍 Snapde,一个专门为编辑超大型数据量CSV文件而设计的单机版电子表格软件:它运行的速度非常快,反应非常灵敏. 二.snapde批量数据筛选功能 如果想要对很多文件筛选出来 ...

  3. csu 1976: 搬运工小明

    1976: 搬运工小明 Submit Page   Summary   Time Limit: 2 Sec     Memory Limit: 128 Mb     Submitted: 94     ...

  4. PowerDNS + PowerDNS-Admin

    一.基础配置 1.1 环境说明 Centos 7.5.1804 PDNS MariaDB 1.2 关闭防火墙和 selinux setenforce sed -i 's/SELINUX=enforci ...

  5. 腾讯物联网操作系统正式开源,最小体积仅1.8 KB

    9月18日,腾讯宣布将开源自主研发的轻量级物联网实时操作系统TencentOS tiny.相比市场上其它系统,腾讯TencentOS tiny在资源占用.设备成本.功耗管理以及安全稳定等层面极具竞争力 ...

  6. java字符串截取

    import org.apache.commons.lang.StringUtils; public class substr{ public static void main(String[] ar ...

  7. 安卓、IOS端AEC密钥加密 Java端密钥解密通用实现(16进制表现形式)

    由于业务需求,需要实现在客户端对重要信息进行加密,在服务端进行解密.客户端包括IOS和安卓的 服务端位Java. 注意密钥 需要保持一致,可以自己定义 . 安卓端加密代码: ============= ...

  8. 【洛谷】P1308 统计单词数-全AC题解(易理解

    弟弟的混乱代码(易理解 大概 思路: 循环b(被找的字符串),遇空格比较两空格间的长度是否与a(需要查找的字符)相等:不相等继续循环:相等比较内容是否相同(倒数比较,不一样直接退出 ,直到比较到第一个 ...

  9. 数据采集,SCADA, 使用MQTT的方式来进行消息单/双向传输,什么场景使用MQTT

    1.先来了解下: 看完得出关键字:发布.订阅模式,事件驱动,主题,生产与消费解耦 2.轻量级 普通的socket连接对服务器的消耗太大了,socket服务端是很消耗资源的,一台服务器能链接的客户端是有 ...

  10. [Centos 7]MYSQL 安装及登录问题

    1. Centos 7 上安装mysql 8 rpm -qa |grep -i mysql //看自己系统有没有装mysql wget https://dev.mysql.com/get/mysql8 ...