P1777 帮助_NOI导刊2010提高(03)
\(\mathcal{Description}\)
Bubu的书架乱成一团了!帮他一下吧!
他的书架上一共有n本书。我们定义混乱值是连续相同高度书本的段数。例如,如果书的高度是30,30,31,31,32,那么混乱值为3,30,32,32,31的混乱度也是3,但31,32,31,32,31的混乱度是5,这实在是太乱了。
Bubu想尽可能地减少混乱度,但他有点累了,所以他决定最多取出k本书,再随意将它们放到书架上。你能帮助他吗?
\(\mathcal{Solution}\)
考虑取出一本书把其认为是删掉这本书,因为总有办法使其不会影响到后面的取书过程
特殊的是如果将一种书全部删掉,那么应该还是会有1的混乱度
如果考虑\(dp\)方式为如何删书,那么这个过程实在复杂
如果考虑最后剩下的书,那么复杂度是\(2^n\)妥妥的\(T\)
但是仔细的想一下,会发现,考虑最后剩下的书时,并不是前面所有的状态都对现在的状态会有影响
即如果一本书隔得较远,则与你当前这本书没有多大关系,在保证所有的状态会被考虑在内的情况下,考虑状态压缩
设\(f[i][j][s][l]\)表示前\(i\)本书,删掉了\(j\)本,剩下书的种类的集合为\(s\),上一本没有被删的书的种类是\(l\)
考虑第\(i\)本书
- 若删掉这本书,则有\(f[i][j+1][s][l]=min\left(f[i][j][s][l],]f[i-1][j][s][l]\right)\)
- 若保留这本书,则有\(f[i][j][s|(1<<h[i])][h[i]]=min\left(f[i][j][s|(1<<h[i])][h[i]],f[i-1][j][s][l]+\left(h[i]==l?0:1\right)\right)\)
最后的时候回来考虑剩下的书的种类集合,如果原本所有书的种类集合\(S\)有一种书,现在没有了,那么我们就多减了一个1,加回来就是
\(\mathcal{Code}\)
/*******************************
Author:Morning_Glory
LANG:C++
Created Time:2019年10月04日 星期五 08时36分03秒
*******************************/
#include <cstdio>
#include <fstream>
#include <algorithm>
#include <cstring>
#define inf 0x7f7f7f7f
using namespace std;
const int maxn = 111;
const int lim = 256;
//{{{cin
struct IO{
	template<typename T>
	IO & operator>>(T&res){
		res=0;
		bool flag=false;
		char ch;
		while((ch=getchar())>'9'||ch<'0')	flag|=ch=='-';
		while(ch>='0'&&ch<='9')	res=(res<<1)+(res<<3)+(ch^'0'),ch=getchar();
		if (flag)	res=~res+1;
		return *this;
	}
}cin;
//}}}
int n,k,cas;
int h[maxn],one[lim+5];
int f[2][maxn][lim+5][11];
bool now,pre;
//f[i][j][k][l] 前i本书选了j本书,存在的书的种类集合为k,上一本书为l
int main()
{
	for (int i=0;i<lim;++i){
		for (int j=0;j<8;++j)
			if (i&(1<<j))	++one[i];
	}
	while (true){
		cin>>n>>k;
		if (n+k==0)	break;
		int S=0,mh=0;
		for (int i=1;i<=n;++i){
			cin>>h[i];
			h[i]-=25;
			S|=1<<h[i];
			mh=max(mh,h[i]);
		}
		++mh;
		memset(f[0],0x7f,sizeof(f[0]));
		now=0;
		f[0][0][1<<h[1]][h[1]]=1;
		f[0][1][0][mh]=0;
		for (int i=2;i<=n;++i){
			now^=1,pre=!now;
			memset(f[now],0x7f,sizeof(f[now]));
			for (int j=0;j<=k;++j){
				for (int s=0;s<=S;++s)
					for (int l=0;l<=mh;++l)
						if (f[pre][j][s][l]!=inf){
							f[now][j][s|(1<<h[i])][h[i]]=min(f[now][j][s|(1<<h[i])][h[i]],f[pre][j][s][l]+(h[i]==l?0:1));
							f[now][j+1][s][l]=min(f[now][j+1][s][l],f[pre][j][s][l]);
						}
			}
		}
		int ans=inf;
		for (int j=0;j<=k;++j)
			for (int s=0;s<=S;++s)
				for (int l=0;l<mh;++l)
					if (f[now][j][s][l]!=inf){
						int take=S^s;
						ans=min(ans,f[now][j][s][l]+one[take]);
					}
		printf("Case %d: %d\n\n",++cas,ans);
	}
	return 0;
}
如有哪里讲得不是很明白或是有错误,欢迎指正
如您喜欢的话不妨点个赞收藏一下吧
P1777 帮助_NOI导刊2010提高(03)的更多相关文章
- 洛谷  P1777 帮助_NOI导刊2010提高(03) 解题报告
		P1777 帮助_NOI导刊2010提高(03) 题目描述 Bubu的书架乱成一团了!帮他一下吧! 他的书架上一共有n本书.我们定义混乱值是连续相同高度书本的段数.例如,如果书的高度是30,30,31 ... 
- 洛谷P1774 最接近神的人_NOI导刊2010提高(02) [2017年6月计划 线段树03]
		P1774 最接近神的人_NOI导刊2010提高(02) 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门 ... 
- P1799 数列_NOI导刊2010提高(06)
		P1799 数列_NOI导刊2010提高(06)f[i][j]表示前i个数删去j个数得到的最大价值.if(i-j==x) f[i][j]=max(f[i][j],f[i-1][j]+1); else ... 
- P1771 方程的解_NOI导刊2010提高(01)
		P1771 方程的解_NOI导刊2010提高(01) 按题意用快速幂把$g(x)$求出来 发现这不就是个组合数入门题吗! $k$个人分$g(x)$个苹果,每人最少分$1$个,有几种方法? 根据插板法, ... 
- 【洛谷】【堆】P1801 黑匣子_NOI导刊2010提高(06)
		[题目描述:] Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两 ... 
- P1776 宝物筛选_NOI导刊2010提高(02)&& 多重背包二进制优化
		多重背包, 要求 \(N\log N\) 复杂度 Solution 众所周和, \(1-N\) 之内的任何数可以由 \(2^{0}, 2^{1}, 2^{2} ... 2^{\log N}, N - ... 
- P1801 黑匣子_NOI导刊2010提高(06)
		P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ... 
- Luogu P1801 黑匣子_NOI导刊2010提高(06)
		P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ... 
- P1794 装备运输_NOI导刊2010提高(04)
		P1794 装备运输_NOI导刊2010提高(04) 题目描述 德国放松对英国的进攻后,把矛头指向了东边——苏联.1943年初,东线的战斗进行到白热化阶段.据可靠情报,90余万德国军队在库尔斯克准备发 ... 
随机推荐
- gogs 实现webhook钩子(php接口形式)
			1.概要流程 2.准备工作 gogs服务器 linux网站服务器(宝塔) 本地客户端 3.编写钩子访问的接口 在public下新建githook.php文件,代码如下: <?php $cmd = ... 
- 前端 img标签显示 base64格式的 图片
			本文链接:https://blog.csdn.net/kukudehui/article/details/80409522在做项目的时候,我从后端返回了一个base64格式的图片文件,想把它渲染在前端 ... 
- gitlab  默认端口修改文件
			vim /var/opt/gitlab/nginx/conf/gitlab-http.conf listen *:80; 
- ffmpeg x264安装
			fmpeg安装第三方编码器(encoder)库,ffmpeg编码h264(完) ffmpeg安装第三方编码器(encoder)库 关键词:ffmpeg.编码h264.第三方encoder 安装好了ff ... 
- 关于xadmin的网址收集
			https://blog.csdn.net/yambo1992/article/details/80918250 https://www.colabug.com/4728510.html django ... 
- ISO/IEC 9899:2011 条款6.9——外部定义
			6.9 外部定义 语法 1.translation-unit: external-declaration translation-unit external-declaration extern ... 
- ROS tf基础使用知识
			博客参考:https://www.ncnynl.com/archives/201702/1306.html ROS与C++入门教程-tf-坐标变换 说明: 介绍在c++实现TF的坐标变换 概念: Co ... 
- oracle根据sqlID查找相对应的sql语句
			转: 根据sqlID查找相对应的sql语句 2019-07-25 14:47:20 猛豪 阅读数 567更多 分类专栏: 数据库 版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议 ... 
- C# log4net 配置及使用详解--日志保存到文件和Access(转)
			按语: 最近项目要求选用Access数据库,但日志管理采用log4net,但保存到数据库一直没有成功,后按照如下配置在程序退出时可以成功保存. 开始新建文件应用log4net.dll ,重新编译就报 ... 
- 安卓微信overflow-x overflow-y引发的bug
			今天xgo文章图片页上线用微信扫页面发现一个bug,页面可以双击放大缩小. 找了半天原因,发现是图片描述设置了overflow-y引发的bug. 建议在微信场景里满屏显示不能滚动的页面里慎用overf ... 
