\(
数据范围暗示状压,爪巴。 \\
首先考虑状态量。 \\
我们设计一个关于乐队数量的状态 S, 代表排列好的乐队。\\
\)

eg:

if(Set_排列好的队列 = {1, 2, 5})
then S = 010011

\(
设f[S]为S状态下排列好的最小代价 \\
s[i][j]为前i个位置有多少个j乐队成员 \\
num[j] 乐队j的人数\\
p.s. 以上三者都可以预处理\\
然后我们就可以得出一个结论:
对于第j个乐队
\)

\[f[S]=min(f[ S \ xor \ (1<<j) ]+num[j]−s[r][j]+s[l][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 邦邦的大合唱站队 题解的更多相关文章

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

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

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

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

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

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

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

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

  5. P3694 邦邦的大合唱站队

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

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

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

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

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

  8. *P3694 邦邦的大合唱站队[dp]

    题目描述 N个偶像排成一列,他们来自M个不同的乐队.每个团队至少有一个偶像. 现在要求重新安排队列,使来自同一乐队的偶像连续的站在一起.重新安排的办法是,让若干偶像出列(剩下的偶像不动),然后让出列的 ...

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

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

随机推荐

  1. 开源!一款功能强大的高性能二进制序列化器Bssom.Net

    好久没更新博客了,我开源了一款高性能的二进制序列化器Bssom.Net和新颖的二进制协议Bssom,欢迎大家Star,欢迎参与项目贡献! Net开源技术交流群 976304396,禁止水,只能讨论技术 ...

  2. E. Almost Regular Bracket Sequence 解析(思維)

    Codeforce 1095 E. Almost Regular Bracket Sequence 解析(思維) 今天我們來看看CF1095E 題目連結 題目 給你一個括號序列,求有幾個字元改括號方向 ...

  3. 权值线段树&&可持久化线段树&&主席树

    权值线段树 顾名思义,就是以权值为下标建立的线段树. 现在让我们来考虑考虑上面那句话的产生的三个小问题: 1. 如果说权值作为下标了,那这颗线段树里存什么呢? ----- 这颗线段树中, 记录每个值出 ...

  4. STM32入门系列-使用库函数点亮LED软硬件分析

    电路图分析 首先找来单片机的原理图,根据原理图进行相关的设计工作. 例如在上图中相同网络标号表示它们是连接在一起的,因此D1发光二极管阴极是连接在STM32的PC0管脚上,D2指示灯阴极连接在PC1管 ...

  5. C#3新增语法特性

    C#3,.Net Framework 3.5 ,Visual Studio 2008, CLR 3.0 C#3.0新引进的语法基于.Net Framework 3.5.主要引进的语法:Linq,隐式类 ...

  6. SpringCloud之Gateway

    一.为什么选择SpringCloud Gateway而不是Zuul? Gateway和Zuul的职责一样,都承担着请求分发,类似Nginx分发到后端服务器. 1.SpingCloud Gateway ...

  7. Java_多线程实现

    一个类两个接口 Tread类: 使用时继承Thread类 Runnable接口: 使用时实现Runnable接口 Callable接口: 使用时实现Callable接口 由于类只能单继承, 接口可以多 ...

  8. 14、Cookie和Session组件

    cookie Cookie的由来 大家都知道HTTP协议是无状态的. 无状态的意思是每次请求都是独立的,它的执行情况和结果与前面的请求和之后的请求都无直接关系,它不会受前面的请求响应情况直接影响,也不 ...

  9. Java 中数组转换为 List

    目录 1 - int 型数组转换为 List 2 - List 转换为 int 型数组 3 - String 型数组转换为 List 4 - List 转换为 String 型数组 版权声明 开发中经 ...

  10. Python--安装 PyQt5, pyqt5-tools

    # 使用豆瓣镜像源 anaconda prompt界面里输入: pip install pyqt5-tools -i https://pypi.douban.com/simple/