题解-mixup2混乱的奶牛

[原题连接](1026-mixup2混乱的奶牛_2021秋季算法入门班第八章习题:动态规划2 (nowcoder.com))

题目描述

混乱的奶牛 [Don Piele, 2007] Farmer John的N(4 <= N <= 16)头奶牛中的每一头都有一个唯一的编号S_i (1 <= S_i <= 25,000). 奶牛为她们的编号感到骄傲, 所以每一头奶牛都把她的编号刻在一个金牌上, 并且把金牌挂在她们宽大的脖子上. 奶牛们对在挤奶的时候被排成一支”混乱”的队伍非常反感. 如果一个队伍里任意两头相邻的奶牛的编号相差超过K (1 <= K <= 3400), 它就被称为是混乱的. 比如说,当N = 6, K = 1时, 1, 3, 5, 2, 6, 4 就是一支”混乱”的队伍, 但是 1, 3, 6, 5, 2, 4 不是(因为5和6只相差1). 那么, 有多少种能够使奶牛排成”混乱”的队伍的方案呢?

输入描述

* 第 1 行: 用空格隔开的两个整数N和K

* 第 2..N+1 行: 第i+1行包含了一个用来表示第i头奶牛的编号的整数: S_i

输出描述

第 1 行: 只有一个整数, 表示有多少种能够使奶牛排成”混乱”的队伍的方案. 答案保证是 一个在64位范围内的整数.

示例1

输入

4 1
3
4
2
1

输出

2

思路

状压dp求解

如果先想一想用dfs的方法怎么做这道题,那么在状压dp时,会比较容易地定义状态和写出状态转移方程

dfs方法

类似全排列的写法。每次选择一头牛,加到队列尾部。根据题目要求,选择的这头牛与它前面那头牛的编号差要大于k。有如下代码:

int que[20];
int ans = 0;
bool vis[20]; void dfs(int step) {
if (step == n + 1) {
ans++;
return;
}
for (int i = 1; i <= n; ++i) {
if (!vis[i] && abs(s[i] - s[step - 1]) > k) {
vis[i] = true;
que[step] = i;
dfs(step + 1);
vis[i] = false;
}
}
}

以上是暴力的dfs写法。

状压dp方法

有了dfs方法的基础,我们也可以用同样的思路

状态定义:状态为i时,某位为1说明选中了对应的牛,为0说明没有选中。那么dp[j][i]表示状态为i时,选中的最后一头牛(队尾的牛)是j的情况下,有多少种方案

已知dp[j][i]的情况下,我们要选择下一头牛(一定从位为0的牛中选择)。假设下一头牛选择是p,那么有转移方程:

dp[p][i | (1 << p)] += dp[j][i];

初始化条件:选择第一个牛,每个牛都有可能被选择作为第一个牛,对应方案数为1,代码如下:

for (int i = 0; i < n; ++i) {
dp[i][1 << i] = 1;
}

AC代码:

#include<bits/stdc++.h>
using namespace std;
using i64 = long long; i64 s[20], dp[20][1 << 17]; int main() {
ios::sync_with_stdio(false);
cin.tie(0); int n, k;
cin >> n >> k;
for (int i = 0; i < n; ++i) {
cin >> s[i];
dp[i][1 << i] = 1;
} for (int i = 0; i < (1 << n); ++i) {
for (int j = 0; j < n; ++j) {
if (!(i & (1 << j))) continue;
for (int p = 0; p < n; ++p) {
if (i & (1 << p)) continue;
if (abs(s[j] - s[p]) > k) {
dp[p][i | (1 << p)] += dp[j][i];
}
}
}
} i64 ans = 0;
for (int i = 0; i < n; ++i) {
ans += dp[i][(1 << n) - 1];
} cout << ans << '\n'; return 0;
}

牛客题解-mixup2混乱的奶牛(状压dp)的更多相关文章

  1. bzoj1231[Usaco2008 Nov]mixup2 混乱的奶牛(状压dp)

    1231: [Usaco2008 Nov]mixup2 混乱的奶牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1032  Solved: 588[ ...

  2. bzoj[Usaco2008 Nov]mixup2 混乱的奶牛 状压dp

    [Usaco2008 Nov]mixup2 混乱的奶牛 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1204  Solved: 698[Submit ...

  3. bzoj 1231: [Usaco2008 Nov]mixup2 混乱的奶牛 -- 状压DP

    1231: [Usaco2008 Nov]mixup2 混乱的奶牛 Time Limit: 10 Sec  Memory Limit: 162 MB Description 混乱的奶牛 [Don Pi ...

  4. B1231 [Usaco2008 Nov]mixup2 混乱的奶牛 状压dp

    发现是状压dp,但是还是不会...之前都白学了,本蒟蒻怎么这么菜,怎么都学不会啊... 其实我位运算基础太差了,所以状压学的不好. 题干: Description 混乱的奶牛 [Don Piele, ...

  5. bzoj1231 [Usaco2008 Nov]mixup2 混乱的奶牛——状压DP

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1231 小型状压DP: f[i][j] 表示状态为 j ,最后一个奶牛是 i 的方案数: 所以 ...

  6. 牛客网 十二桥问题(状压DP)

    https://ac.nowcoder.com/acm/contest/1104/B 注意到\(\text{K}\)只有\(12\),因此对起点与每个毕经边对应的点单源最短路,\(\text{DP}\ ...

  7. 【bzoj1231】[Usaco2008 Nov]mixup2 混乱的奶牛 状态压缩dp

    题目描述 混乱的奶牛[Don Piele, 2007]Farmer John的N(4 <= N <= 16)头奶牛中的每一头都有一个唯一的编号S_i (1 <= S_i <= ...

  8. BZOJ 1231: [Usaco2008 Nov]mixup2 混乱的奶牛 状态压缩dp

    开始读错题了,然后发现一眼切~ Code: #include <cstdio> #include <algorithm> #define ll long long #defin ...

  9. HDU 5765 Bonds(状压DP)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5765 [题目大意] 给出一张图,求每条边在所有边割集中出现的次数. [题解] 利用状压DP,计算不 ...

  10. 【XSY2745】装饰地板 状压DP 特征多项式

    题目大意 你有\(s_1\)种\(1\times 2\)的地砖,\(s_2\)种\(2\times 1\)的地砖. 记铺满\(m\times n\)的地板的方案数为\(f(m,n)\). 给你\(m, ...

随机推荐

  1. 在Mac搭建一个便捷的Markdown创作环境

    前言 使用 Typora + PicGo + Gitee + Snipaste 在 Mac 搭建一个 Markdown 编辑环境. Typora 是一款简洁的 Markdown 编辑器: PicGo ...

  2. 二进制安装Kubernetes,一键安装脚本

    背景,最近几天闲着研究Kubernetes,发现使用手动二进制安装会有些繁琐.经过突发奇想,就出现这个脚本. 声明,该脚本不及互联网上其他大佬的一件脚本,该脚本仅仅是突发奇想编写的,希望大佬不喜勿喷. ...

  3. mysql的查询--子查询,order by,group by,having

    一. 1.多表查询 格式1: select 字段列表 from 表1 join 表2 on 表1.字段1=表2.字段1 where 查询条件 格式2: select 字段列表 from 表1 join ...

  4. Spring Boot 整合 Kafka

    Kafka 环境搭建 kafka 安装.配置.启动.测试说明: 1. 安装:直接官网下载安装包,解压到指定位置即可(kafka 依赖的 Zookeeper 在文件中已包含) 下载地址:https:// ...

  5. Yii framework 应用小窍门

    Yii framework 应用小窍门     1. Yii Framework] 如何获取当前controller的名称?  下面语句就可以获取当前控制器的名称了! Php代码   Yii::app ...

  6. 【Mybatis】(一)

    Mybatis简介 提供持久层框架包括SQL Maps和Data Access Objects(DAO). SQL Maps提供数据库数据和java数据的映射关系,换句话说即是封装JDBC的过程. D ...

  7. win系统安装wordcloud报错解决方案

    问题: ① 在命令行下执行pip install wordcloud出现报错如图: ②下载了错误的whl文件, 出现wordcloud-1.4.1-cp27-cp27m-win_amd64.whl i ...

  8. NC23054 华华开始学信息学

    题目链接 题目 题目描述 因为上次在月月面前丢人了,所以华华决定开始学信息学.十分钟后,他就开始学树状数组了.这是一道树状数组的入门题: 给定一个长度为 \(N\) 的序列 \(A\) ,所有元素初值 ...

  9. Jupyter Notebook(或vscode插件) 一个cell有多个输出

    方法一 在文件的开头加上如下代码,该方法仅对当前文件有效 from IPython.core.interativeshell import InteractiveShell InteractiveSh ...

  10. Nginx常用基础模块

    Nginx常用基础模块 目录 Nginx常用基础模块 目录索引模块 配置方式 nginx的状态模块 配置方式 nginx访问控制模块 配置方式 nginx的访问限制模块 请求限制重定向 Nginx连接 ...