题目传送门

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


我们注意到,团体队员数$N$比较大,而团体数$M$很小(不能称为乐队)。那么我们可以在$m$上下功夫,把它压成二进制串。开始想的状态是0表示这个团体还没站好,1表示这个团体已经站好了。看了看jtdalao的文章发现自己的状态是对的,但是转移嘛...,有点迷感觉。一步一步来。首先我们肯定要枚举当前的状态是什么,按照状压dp的套路,我们接下来要枚举下这一次新站好的是哪个队。转移时我们需要用在新队站好前的状态所需的次数+站成新队另需要的人数。我们默认大家都是排成一列紧跟在一个人之后的,所以我们需要求出当前已经排到谁了。所以我们还需要开一个数组前缀和来记录排队的信息。设$sum[i][j]$表示到$i$位置,$j$团体的人数。

转移有:

$f[i]$=$min$$($f[i^(1<<j)]$+$num[j]$-($sum[pos][j]$-$sum[pos-num[j]][j]$))。

因为当前新加的段之前也可能有本队队员,所以把他们减去。

初值,因为求最小,所以开始赋成极大,$f[0]=0$。(边界)

之后就比较好想了==。


$Code$

 #include<cstdio>
#include<algorithm>
#include<cstring> using namespace std; int n,m,fAKe;
int f[<<],num[],sum[][]; int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
int x=;
scanf("%d",&x);
num[x-]++;
sum[i][x-]++;
for(int j=;j<m;j++)
sum[i][j]+=sum[i-][j];
}
fAKe=(<<m)-;
memset(f,0x3f,sizeof(f));
f[]=;
for(int i=;i<=fAKe;i++)
{
int pos=;
for(int j=;j<m;j++)
if(i&(<<j)) pos+=num[j];
for(int j=;j<m;j++)
f[i]=min(f[i],f[i^(<<j)]+num[j]-(sum[pos][j]-sum[pos-num[j]][j]));
}
printf("%d\n",f[fAKe]);
return ;
}

Luogu P3694 邦邦的大合唱站队 【状压dp】By cellur925的更多相关文章

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

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

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

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

  3. 【Luogu】P1896互不侵犯King(状压DP)

    题目链接 真是可恶,被数据范围坑了一把.想要一遍AC的希望破灭了…… 以后大家在做状压DP的时候一定要开long long…… 设f[i][j][k]表示考虑前i行,总共放了j个King,第i行状态为 ...

  4. 【Luogu】P2831愤怒的小鸟(手算抛物线+状压DP)

    题目链接 设f[s]表示二进制集合表示下的s集合都打掉用了多少小鸟. 预处理出lne[i][j]表示i.j确定的抛物线能打掉的小鸟集合. 于是就有f[s|lne[i][j]]=min(f[s|lne[ ...

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

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

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

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

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

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

  8. BZOJ 4042 Luogu P4757 [CERC2014]Parades (树形DP、状压DP)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4042 (Luogu) https://www.luogu.org/prob ...

  9. [Luogu P3959] 宝藏 (状压DP+枚举子集)

    题面 传送门:https://www.luogu.org/problemnew/show/P3959 Solution 这道题的是一道很巧妙的状压DP题. 首先,看到数据范围,应该状压DP没错了. 根 ...

随机推荐

  1. HDU 1248 寒冰王座 (水题的N种做法!)(含完全背包)

    寒冰王座 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  2. [leetcode解题记录]Jump Game和Jump Game II

    Jump Game Given an array of non-negative integers, you are initially positioned at the first index o ...

  3. AliYunDun关闭

    停止阿里云盾AliYunDun服务解决大量写磁盘问题-小内存ECS服务器 阿里云数据库在没备案,涉及大量IO操作时会自动启动阿里云盾这个服务,会导致服务器变得很卡 关闭服务: service aegi ...

  4. 进程-IPC 管道 (一)

    详见:https://github.com/ZhangzheBJUT/linux/blob/master/IPC(%E4%B8%80).md 一 IPC 概述 进程间通信就是在不同进程之间传播或交换信 ...

  5. TestNG – Run multiple test classes (suite test)

    In this tutorial, we will show you how to run multiple TestNG test cases (classes) together, aka sui ...

  6. SDUT 3035 你猜我猜不猜你猜不猜(字符串 规律性)

    你猜我猜不猜你猜不猜 Time Limit: 2000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 In the past 39th annual ACM in ...

  7. Centos7.2——自定义系统服务

    前言 顾明思议,自己创建系统服务,在上一篇博文中写道了,这里就详细写下~ 步骤 我是一段美丽的用户分割的废话~ 进入到系统服务目录 ··· cd /lib/systemd/system ··· 创建服 ...

  8. 利用Swoole实现PHP+websocket直播,即使通讯

    websocket Websocket只是一个网络通信协议,就像 http.ftp等都是网络通信的协议一样:相对于HTTP这种非持久的协议来说,Websocket是一个持久化网络通信的协议: WebS ...

  9. docker 初试---常用命令

    http://blog.csdn.net/wsscy2004/article/details/25878363 常用命令 查看容器的root用户密码 docker logs <容器名orID&g ...

  10. SPOJ:Eagle and Dogs(求树上每个点最远可以走到哪里---树的直径||DP)

    Eagle (AKA Mohamed Ahmed) lives in a city consists of n intersections connected by n-1 roads, in a w ...