ACM模版

描述

题解

状压 DPDP。

设 dp[i][j][k][s]dp[i][j][k][s] 表示为前 ii 本书拿走 jj 本剩下的书状态为 kk 最后一本书的高度是 ss 的最少类数。这里的状态指的是剩下的书所有的高度,而不是剩下的书的序列状态,为什么要这样设置呢?因为我们设置的抽出的书并没有直接考虑如何插入,而是放到最后统一插入,如果抽出的书中有高度 xx,而剩下的书也有高度 xx 自然是不需要产生更多类的,否则就需要产生新的类。所以最后遍历一遍 dp[cur]dp[cur],判断不同状态 kk 所对应的被抽书状态与 kk 的差集,这个差集就是需要产生的新的类。

神乎其技的状压 DPDP,注意边界问题,注意滚动数组。

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>using namespace std;const int MAXB = 8;
const int MAXN = 110;
const int MAXM = 1 << MAXB;
const int LIMIT = 25;
const int INF = 0x3f3f3f3f;int n, m, ans;
int book[MAXN];
int cnt[MAXM];
int state;
int dp[2][MAXN][MAXM][MAXB + 1];void init()
{for (int i = 0; i < MAXM; i++){for (int j = 0; j < MAXB; j++){if (i & (1 << j)){cnt[i]++;}}}
}int main()
{init();int ce = 0;while (~scanf("%d%d", &n, &m) && n + m){int mx = state = 0;for (int i = 1; i <= n; i++){scanf("%d", book + i);book[i] -= LIMIT;if (book[i] > mx){mx = book[i];}state |= (1 << book[i]);}++mx;int tot = (1 << mx);memset(dp[1], 0x3f, sizeof(dp[1]));dp[1][0][1 << book[1]][book[1]] = 1;dp[1][1][0][mx] = 0;for (int i = 2; i <= n; i++){int cur = i & 1;int pre = 1 - cur;memset(dp[cur], 0x3f, sizeof(dp[cur]));for (int j = 0; j <= m && j < i; j++){for (int k = 0; k < tot; k++){for (int s = 0; s <= mx; s++){if (dp[pre][j][k][s] == INF){continue;}int tmp = k | (1 << book[i]);if (j < m){dp[cur][j + 1][k][s] = min(dp[cur][j + 1][k][s], dp[pre][j][k][s]);    //  取最后一本}if (s == book[i]){dp[cur][j][k][s] = min(dp[cur][j][k][s], dp[pre][j][k][s]);}else{dp[cur][j][tmp][book[i]] = min(dp[cur][j][tmp][book[i]],dp[pre][j][k][s] + 1);}}}}}int cur = n & 1;int ans = n, st;for (int j = 0; j <= m; j++){for (int k = 0; k < tot; k++){for (int s = 0; s < mx; s++){if (dp[cur][j][k][s] != INF){st = state ^ k;        //  抽走的就是额外的类ans = min(ans, cnt[st] + dp[cur][j][k][s]);}}}}printf("Case %d: %d\n\n", ++ce, ans);}return 0;
}

HDU-3237-Help Bubu相关推荐

  1. HDU 3966 POJ 3237 HYSBZ 2243 HRBUST 2064 树链剖分

    树链剖分是一个很固定的套路 一般用来解决树上两点之间的路径更改与查询 思想是将一棵树分成不想交的几条链 并且由于dfs的顺序性 给每条链上的点或边标的号必定是连着的 那么每两个点之间的路径都可以拆成几 ...

  2. UVA 12235 Help Bubu

    状态压缩DP 题意: 书架上有n本书,给出一个书的高度的序列,我们把相邻的高度相同的书看成一个片段,并且定义该书架的混乱程度为片段的个数.为整理书架,你最多可以从中拿出k本书,然后再把他们插回书架(其 ...

  3. HDU——1106排序(istringstream的使用、STLvector练习)

    排序 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submiss ...

  4. hdu 5438 Ponds 拓扑排序

    Ponds Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/contests/contest_showproblem ...

  5. HDU 1248 寒冰王座(全然背包:入门题)

    HDU 1248 寒冰王座(全然背包:入门题) http://acm.hdu.edu.cn/showproblem.php?pid=1248 题意: 不死族的巫妖王发工资拉,死亡骑士拿到一张N元的钞票 ...

  6. hdu 1312 Red and Black 解题报告

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1312 第二条深搜,题目并不难,但是做了我好久好久,由于一个细节,让我赌上了一个晚上的时间. 题目大意: ...

  7. HDU 1429 胜利大逃亡(续) (BFS+位压缩)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1429 胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)  ...

  8. hdu 1272 小希的迷宫

    Problem Description 上次Gardon的迷宫城堡小希玩了很久(见Problem B),现在她也想设计一个迷宫让Gardon来走.但是她设计迷宫的思路不一样,首先她认为所有的通道都应该 ...

  9. HDOJ 1157 HDU 1157 Who's in the Middle ACM 1157 IN HDU

    MiYu原创, 转帖请注明 : 转载自 ______________白白の屋   题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=1157 题目描述: ...

  10. 大数加法【HDU 1002】

    大数加法模板 一般的加法只要int类型的两数直接相加即可,大一点的数可以设为long long类型,而超过长整型的数则属于大数问题了,大数加法其实也比较简单,利用数组实现就可以啦: 主要思想如下: ( ...

最新文章

  1. 2018年中国研究生数学建模竞赛C题 二等奖 赛题论文
  2. 学习Duwamish7的MSDN说明及相关技术策略
  3. 一台微型计算机性能的主要参数及其意义,微型计算机的主要性能指标.ppt
  4. java运行 mavenzip包_JAVA开发必知工具-Maven-Maven生成可以直接运行的jar包的多种方式...
  5. About static contructor API changes in cocos2d-...
  6. 惠普收购Palm意在遏制同系竞争
  7. 阿里云 ubuntu 安装 curl
  8. Java从入门到熟悉的48道练习题[完结]
  9. python 蒙特卡洛模拟股价_利用python进行蒙特卡罗模拟
  10. composer 升级/降级安装包
  11. Worthington 分子生物学解读
  12. c语言二级程序设计题难吗,c语言二级公共基础知识试题特点
  13. 一文搞懂PMP挣值管理那些让你头疼的公式
  14. (2021网络安全中职组脚本)免费的脚本哦!
  15. APP二维码渠道统计解决方案
  16. android实现棱形效果
  17. 网管软件哪家比较好用
  18. server 服务器文档,aserver 服务器
  19. SLAM学习资料收集
  20. 全屋智能方案与智能单品有什么区别?看完你就懂了

热门文章

  1. 不是计算机专业的,可以转行学IT吗?
  2. 万娟 白话大数据和机械学习_《白话大数据与机器学习》.pdf
  3. Misumi米思米数据线驱动无法安装
  4. php 竖向文字水印,PHP中实现文字水印和图片水印的方法
  5. PCB安规设计是怎样的?怎样设计高压电源的安规?ECM设计间距是怎样的,CAF设计间距要求是怎样的?电源的PCB间距设计指南,安规标准有哪些?380V电源安规设计
  6. 基于遗传算法的新安江模型参数优化率定(二)
  7. #前端# 万字总结!前端项目化超详细方法及思路!
  8. miui11稳定版获取完整root_怎么获取root权限-MIUI11系统开启系统ROOT权限图文教程-支持小米红米全部机型...
  9. 《计算传播学导论》读书笔记:第六章 网络传播模型与机器学习框架
  10. 【中软杯国二开源】基于PaddleOCR和深度学习的企业实体识别