P3694 邦邦的大合唱站队 题解
\(
数据范围暗示状压,爪巴。 \\
首先考虑状态量。 \\
我们设计一个关于乐队数量的状态 S, 代表排列好的乐队。\\
\)
eg:
if(Set_排列好的队列 = {1, 2, 5})
then S = 010011
\(
设f[S]为S状态下排列好的最小代价 \\
s[i][j]为前i个位置有多少个j乐队成员 \\
num[j] 乐队j的人数\\
p.s. 以上三者都可以预处理\\
然后我们就可以得出一个结论:
对于第j个乐队
\)
\]
\(其中num[j] - s[r][j] + s[l][j]是乐队j的花费\)
这么说来,倒是有一点背包的味道了。
#include <bits/stdc++.h>
#define LL long long
#define il inline
#define rg register
using namespace std;
int t, n, m;
const int maxn = 2e6 + 5;
const int maxs = 2e5 + 5;
il void chkmax(int &a, int b) {a = a > b ? a : b;}
il void chkmin(int &a, int b) {a = a < b ? a : b;}
il int read() {
int x = 0, f = 1; char c = getchar();
while(!isdigit(c)) {
if(c == '-') f = -f;
c = getchar();
}
while(isdigit(c)) {
x = (x << 1) + (x << 3) + c - '0';
c = getchar();
}
return x * f;
}
il void write(int x) {
char c[33] = {0}, tot = 0;
if(x == 0) {puts("0"); return;}
while(x) {c[++ tot] = x % 10 + '0'; x /= 10;}
while(tot) {putchar(c[tot --]);}
return ;
}
int f[maxn];
int s[maxs][30], num[30], sum[maxn];
il bool chk(int state, int d) {
return state & (1 << d - 1);
}
il void dfs(int x, int s, int d) {
if(x ^ m) {
if(d == 1) {
sum[s | (1 << x)] = sum[s] + num[x + 1];
dfs(x + 1, (s | (1 << x)), 1);
dfs(x + 1, (s | (1 << x)), 0);
} else {
dfs(x + 1, s, 1);
dfs(x + 1, s, 0);
}
}
}
int main() {
n = read(), m = read();
for(int i = 1, x;i <= n;i ++) {
x = read();
for(int j = 1;j <= m;j ++) {
s[i][j] = s[i - 1][j];
}
s[i][x] ++, num[x] ++;
}
dfs(0, 0, 0); dfs(0, 0, 1);
memset(f, 0x3f, sizeof(f));
f[0] = 0;
for(int i = 1;i < (1 << m);i ++) {
for(int j = 1;j <= m;j ++) {
int l = sum[i ^ (1 << j - 1)];
int r = sum[i];
if(chk(i, j)){
chkmin(f[i], f[i ^ (1 << j - 1)] + (r - l) - (s[r][j] - s[l][j]));
}
}
}
cout << f[(1 << m) - 1];
return 0;
}
P3694 邦邦的大合唱站队 题解的更多相关文章
- 状压DP 【洛谷P3694】 邦邦的大合唱站队
[洛谷P3694] 邦邦的大合唱站队 题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶 ...
- 洛谷P3694 邦邦的大合唱站队/签到题
P3694 邦邦的大合唱站队/签到题 题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶 ...
- P3694 邦邦的大合唱站队/签到题(状压dp)
P3694 邦邦的大合唱站队/签到题 题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶 ...
- P3694 邦邦的大合唱站队 (状压DP)
题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶像. 现在要求重新安排队列,使来自同一 ...
- P3694 邦邦的大合唱站队
题目背景 BanG Dream!里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. 题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶像. 现在要求重新安排队列,使来自同一 ...
- 洛谷P3694 邦邦的大合唱站队【状压dp】
状压dp 应用思想,找准状态,多考虑状态和\(f\)答案数组的维数(这个题主要就是找出来状态如何转移) 题目背景 \(BanG Dream!\)里的所有偶像乐队要一起大合唱,不过在排队上出了一些问题. ...
- Luogu P3694 邦邦的大合唱站队 【状压dp】By cellur925
题目传送门 最开始学状压的时候...学长就讲的是这个题.当时对于刚好像明白互不侵犯和炮兵阵地的我来说好像在听天书.......因为我当时心里想,这又不是什么棋盘,咋状压啊?!后来发现这样的状压多了去了 ...
- *P3694 邦邦的大合唱站队[dp]
题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶像. 现在要求重新安排队列,使来自同一乐队的偶像连续的站在一起.重新安排的办法是,让若干偶像出列(剩下的偶像不动),然后让出列的 ...
- 洛谷 P3694 邦邦的大合唱站队 状压DP
题目描述 输入输出样例 输入 #1 复制 12 4 1 3 2 4 2 1 2 3 1 1 3 4 输出 #1 复制 7 说明/提示 分析 首先要注意合唱队排好队之后不一定是按\(1.2.3..... ...
随机推荐
- Filebeat 根据不同的日志设置不同的索引
平时在物理机上使用 Filebeat 收集日志时,会编写多个 filebeat 配置文件然后启动多个 filebeat 进程来收集不同路径下的日志并设置相对应的索引.那么如果将所有的日志路径都写到一个 ...
- Gerrit 服务搭建和升级详解(包括 H2 数据库迁移 MySQL 步骤)
1. 安装Gerrit-2.9.5版本(Ubuntu) Gerrit版本:Gerrit-2.9.5.war 操作系统:Ubuntu 16.04.3 JAVA环境:java version " ...
- yython爬虫基础知识入门
Python爬虫 关注公众号"轻松学编程"了解更多. 大纲: 1.获取响应 urllib(python3)/urllib2-urllib(python2) requests(url ...
- (三)URI、URL和URN/GET与POST的区别
(一)URI.URL.URN HTTP使用统一资源标识符(Uniform Resource Identifiers,URI)来传输数据和建立连接. URL是一种特殊类型的URI,包含了用于查找某个资源 ...
- php抽奖程序
//php概率抽奖算法 1.获取总的概率数 2.随机从1到总概率数 3.判断获取的随机数是否在小于等于(就是你随机的数是否在数组值得范围中比如数组为array(1,2,3,4,5,6)则随机出了一个数 ...
- python语言编程算法
编程题 1 台阶问题/斐波那契 一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个n级的台阶总共有多少种跳法. fib = lambda n: n if n <= 2 else fi ...
- codeforces 1425E,一万种情况的简单题
大家好,欢迎阅读codeforces专题. 我们今天选中的是codeforces 1425场比赛的E题,这是一场印尼多校联合的ICPC的练习赛.ACM赛制,难度也比较近似.我们今天选择的是其中的一道M ...
- JavaScript ES 模块:现代化前端编程必备技能
自从 ES 模块被添加到规范中后,JavaScript 中的模块就更加简单了.模块按文件分开,异步加载.导出是用 export 关键字定义的:值可以用 import 关键字导入. 虽然导入和导出单个值 ...
- Oracle(第二天)
一.外键(foreign key):constraint , refenerces 例如:sno number(7) constraint fk_sno references student(sno) ...
- Electron入门指北
最近几年最火的桌面化技术,无疑是Qt+和Electron. 两者都有跨平台桌面化技术,并不局限于Windows系统.前者因嵌入式而诞生,在演变过程中,逐步完善了生态以及工具链.后者则是依托于Node. ...