P3694 邦邦的大合唱站队 (状压DP)
题目背景
BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题。
题目描述
N个偶像排成一列,他们来自M个不同的乐队。每个团队至少有一个偶像。
现在要求重新安排队列,使来自同一乐队的偶像连续的站在一起。重新安排的办法是,让若干偶像出列(剩下的偶像不动),然后让出列的偶像一个个归队到原来的空位,归队的位置任意。
请问最少让多少偶像出列?
输入输出格式
输入格式:
第一行2个整数N,M。
接下来N个行,每行一个整数 a_i(1\le a_i \le M)ai(1≤ai≤M) ,表示队列中第i个偶像的团队编号。
输出格式:
一个整数,表示答案
输入输出样例
12 4
1
3
2
4
2
1
2
3
1
1
3
4
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
Solution
本蒟蒻做的第一道状压DP. 发现根本不会怎么搞...结果竟然不仅看了题解定义的状态,居然还看了转移方程(我也是水到了一定境界).
看来 DP 还是不够啊 ! ! 进入正题:
首先关于题意,有几点需要注意:
1.每个人离开之后,会有一个空位,而且肯定会有另外一个人补上来.
2.最终状态不一定要求团队按正序排列.
状态定义:
f [ i ] 表示当前达到这种状态所需要请出去的最少的人.
然后关于 i 转为 二进制后上的每一位,都表示当前这个团队已经站在了一起.
然后转移方程:
f[i]=min(f[i xor 2j]+num[j]−(sum[length][j]−sum[length−num[j]][j]));
j表示团队编号,sum表示某种团队的前缀和.length表示到此已经排到的长度.
然后代码里面有解释.
#include<bits/stdc++.h>
using namespace std;
int n,m;
int c[],f[];
int sum[][];
int main()
{
scanf("%d%d",&n,&m);
for(int i=;i<=n;i++)
{
scanf("%d",&c[i]);
c[i]--;
//减掉一维可以省空间
for(int j=;j<m;j++)
{
sum[i][j]=sum[i-][j];
if(j==c[i])
sum[i][j]++;
}
}
for(int i=;i<(<<m);i++)
f[i]=;
//赋值为极大值
f[]=;
for(int i=;i<(<<m);i++)
{
int now=;
//now表示当前这个状态哪一些单位无需处理.
for(int j=;j<m;j++)
if((<<j)&i) now+=sum[n][j];
for(int j=;j<m;j++)
{
if((<<j)&i) continue;
int num=sum[n][j];
int r=now+num;
int l=now;
f[i|(<<j)]=min(f[i|(<<j)],f[i]+(r-l-(sum[r][j]-sum[l][j])));
/*此时的决策:
即新加一个团队. 更新状态:
需要先计算当前这种情况所达到的点.
即满足当前这种情况的话,我们已经到了何处.
然后的话,我们此时需要将后面的这个团队的人补上来.
所以需要花费的代价即是
当前这个团队所有的人
减去当前这个点所有的这个团队的人 */
}
}
printf("%d\n",f[(<<m)-]);
return ;
}
P3694 邦邦的大合唱站队 (状压DP)的更多相关文章
- 洛谷 P3694 邦邦的大合唱站队 状压DP
题目描述 输入输出样例 输入 #1 复制 12 4 1 3 2 4 2 1 2 3 1 1 3 4 输出 #1 复制 7 说明/提示 分析 首先要注意合唱队排好队之后不一定是按\(1.2.3..... ...
- P3694 邦邦的大合唱站队/签到题(状压dp)
P3694 邦邦的大合唱站队/签到题 题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶 ...
- 洛谷P3694 邦邦的大合唱站队【状压dp】
状压dp 应用思想,找准状态,多考虑状态和\(f\)答案数组的维数(这个题主要就是找出来状态如何转移) 题目背景 \(BanG Dream!\)里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. ...
- Luogu P3694 邦邦的大合唱站队 【状压dp】By cellur925
题目传送门 最开始学状压的时候...学长就讲的是这个题.当时对于刚好像明白互不侵犯和炮兵阵地的我来说好像在听天书.......因为我当时心里想,这又不是什么棋盘,咋状压啊?!后来发现这样的状压多了去了 ...
- [luoguP3694] 邦邦的大合唱站队/签到题(状压DP)
传送门 来自kkk的题解: 70分做法:枚举每个学校顺序,暴力. 100分:状压dp.从队列头到尾DP, 状态:f[i]表示i状态下最小的出列(不一致)的个数. 比如f[1101]表示从头到位为1/3 ...
- BZOJ 1087: [SCOI2005]互不侵犯King [状压DP]
1087: [SCOI2005]互不侵犯King Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3336 Solved: 1936[Submit][ ...
- nefu1109 游戏争霸赛(状压dp)
题目链接:http://acm.nefu.edu.cn/JudgeOnline/problemShow.php?problem_id=1109 //我们校赛的一个题,状压dp,还在的人用1表示,被淘汰 ...
- poj3311 TSP经典状压dp(Traveling Saleman Problem)
题目链接:http://poj.org/problem?id=3311 题意:一个人到一些地方送披萨,要求找到一条路径能够遍历每一个城市后返回出发点,并且路径距离最短.最后输出最短距离即可.注意:每一 ...
- [NOIP2016]愤怒的小鸟 D2 T3 状压DP
[NOIP2016]愤怒的小鸟 D2 T3 Description Kiana最近沉迷于一款神奇的游戏无法自拔. 简单来说,这款游戏是在一个平面上进行的. 有一架弹弓位于(0,0)处,每次Kiana可 ...
随机推荐
- IOS实现弹出菜单效果MenuViewController(背景 景深 弹出菜单)
在写项目时,要实现一个从下移上来的一个弹出菜单,并且背景变深的这么一个效果,在此分享给大家. 主要说一下思路及一些核心代码贴出来,要想下载源码, 请到:http://download.csdn.net ...
- 连接MongoDB数据库的配置说明
- python打开文件可以有多种模式
一.python打开文件可以有多种模式,读模式.写模式.追加模式,同时读写的模式等等,这里主要介绍同时进行读写的模式r+ python通过open方法打开文件 file_handler = open( ...
- SQL server 数据库基础语句 子查询 基础函数
上一章 说了下 子查询的意义是 把一条查询语句当做值来使用 select *from car //查询汽车的信息 假设我知道一个汽车的编号是 c021 但是我要查询 比这个汽车价格高的汽车信息 ...
- 纪念一下我的第一个php扩展
C扩展代码 生成 so扩展文件( 很多文章介绍 生成so时候 喜欢用 # phpize ./configure ...... 刚开始掉进坑里面出不来 就是因为把这两个命令看成了一个 phpize ./ ...
- DRM 简介
首先,我们对和DRM 相关的一些概念进行介绍. Buffer: 对于RAC 数据库,当一个数据块被读入到buffer cache后,我们就称其为buffer , cache fusion 会将这个bu ...
- PAT (Basic Level) Practise (中文)-1027. 打印沙漏(20)
PAT (Basic Level) Practise (中文)-1027. 打印沙漏(20) http://www.patest.cn/contests/pat-b-practise/1027 本题 ...
- shell脚本,awk 匹配的做修改后打印,不匹配的打印。
文件file内容如下a 1a 2b 3b 4 b 5c 6c 7 要求:第一列匹配b时,如果第二列大于3,那么将第二列加上1后打印,其余的原封不动打印.结果如下: a 1a 2b 3b 5 b 6c ...
- js的工厂模式
工厂模式: 什么叫工厂模式,工厂就是大家大脑里想的那样,一个流水线作业的一个东西,只需要满足刚需就可以了,一个人,只干一件事,最后串起来,就是一个事件. 首先需要说一下工厂模式.工厂模式根据抽象程度的 ...
- mysqldump导出备份数据库报Table ‘performance_schema.session_variables‘ doesn‘t exist
今天在bash进行本地数据库往云端数据库导数据的时候,在本地导出.sql文件这第一步就出现了错误问题,导出sql文件的命令: mysqldump -u 用户名 -p 数据库名 > xxx.sql ...