题目描述

Bubu的书架乱成一团了!帮他一下吧!

他的书架上一共有n本书。我们定义混乱值是连续相同高度书本的段数。例如,如果书的高度是30,30,31,31,32,那么混乱值为3,30,32,32,31的混乱度也是3,但31,32,31,32,31的混乱度是5-,这实在是太乱了。

Bubu想尽可能地减少混乱度,但他有点累了,所以他决定最多取出k本书,再随意将它们放到书架上。你能帮助他吗?

输入格式

最多会有20组测试数据。每组测试数据开头为两个整数n,k(l≤k≤n≤100),表示总共有n本书,最多可以进行k次搬书操作。接下来一行有n个整数,表示每本书的高度,从左到右。每本书的高度是25到32间的整数。最后一组数据后有一行n=k=0。

输出格式

对于每一组数据,输出Case标号和最终最小的混乱度。在每组数据后打印一个空行。

输入输出样例

输入 #1
    5 2
25 25 32 32 25
5 1
25 26 25 26 25
0 0
输出 #1
    Case 1:2
Case 2:3
分析:
本题给定的数据显然让我们想到状态压缩DP,那么我们可以设计状态f[i][j][s][l],表示前i个选了j个状态为s最后一个为l所能得到最小的混乱度,然后进行状态转移即可。
然后发现我的代码最后一个点超时,死活过不去。。。所以我开了O2。。。
CODE:
 #include<cstdio>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int M=;
const int N=;
int f[][M][N][];
int a[M],b[N];
int n,k,cnt;
int get(){
char c=getchar();
int res=,f=;
while (c>''||c<''){
if (c=='-') f=-;
c=getchar();
}
while (c<=''&&c>=''){
res=(res<<)+(res<<)+c-'';
c=getchar();
}
return res*f;
}
int main(){
for(int i=;i<(<<);i++){
b[i]=;
for(int j=;j<;j++)
if(i&(<<j)) b[i]++;
}
while(~scanf("%d%d",&n,&k)&&(n+k)){
int S=,maxn=;
for(int i=;i<=n;i++){
a[i]=get();
a[i]-=;
S=S|(<<a[i]);
maxn=max(maxn,a[i]);
}
maxn++;
memset(f[],,sizeof(f[]));
f[][][][maxn]=;
f[][][(<<a[])][a[]]=;
int cur=,pre=;
for(int i=;i<n;i++){
cur=pre^;
memset(f[cur],,sizeof(f[cur]));
for(int j=;j<=k;j++){
for(int s=;s<=S;s++){
for(int l=;l<=maxn;l++){
if(f[pre][j][s][l]==) continue;
f[cur][j][s|(<<a[i+])][a[i+]]=min(f[cur][j][s|(<<a[i+])][a[i+]],f[pre][j][s][l]+(a[i+]==l?:));
f[cur][j+][s][l]=min(f[cur][j][s][l],f[pre][j][s][l]);
}
}
}
pre=cur;
}
int ans=;
for(int j=;j<=k;j++){
for(int s=;s<=S;s++){
for(int l=;l<maxn;l++){
if(f[cur][j][s][l]==)continue;
int now=S^s;
ans=min(ans,f[cur][j][s][l]+b[now]);
}
}
}
printf("Case %d: %d\n\n",++cnt,ans);
}
return ;
}

帮助_NOI导刊2010提高(03)的更多相关文章

  1. 洛谷 P1777 帮助_NOI导刊2010提高(03) 解题报告

    P1777 帮助_NOI导刊2010提高(03) 题目描述 Bubu的书架乱成一团了!帮他一下吧! 他的书架上一共有n本书.我们定义混乱值是连续相同高度书本的段数.例如,如果书的高度是30,30,31 ...

  2. 洛谷P1774 最接近神的人_NOI导刊2010提高(02) [2017年6月计划 线段树03]

    P1774 最接近神的人_NOI导刊2010提高(02) 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门 ...

  3. 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 ...

  4. P1771 方程的解_NOI导刊2010提高(01)

    P1771 方程的解_NOI导刊2010提高(01) 按题意用快速幂把$g(x)$求出来 发现这不就是个组合数入门题吗! $k$个人分$g(x)$个苹果,每人最少分$1$个,有几种方法? 根据插板法, ...

  5. 【洛谷】【堆】P1801 黑匣子_NOI导刊2010提高(06)

    [题目描述:] Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个Black Box要处理一串命令. 命令只有两 ...

  6. P1776 宝物筛选_NOI导刊2010提高(02)&& 多重背包二进制优化

    多重背包, 要求 \(N\log N\) 复杂度 Solution 众所周和, \(1-N\) 之内的任何数可以由 \(2^{0}, 2^{1}, 2^{2} ... 2^{\log N}, N - ...

  7. P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  8. Luogu P1801 黑匣子_NOI导刊2010提高(06)

    P1801 黑匣子_NOI导刊2010提高(06) 题目描述 Black Box是一种原始的数据库.它可以储存一个整数数组,还有一个特别的变量i.最开始的时候Black Box是空的.而i等于0.这个 ...

  9. P1794 装备运输_NOI导刊2010提高(04)

    P1794 装备运输_NOI导刊2010提高(04) 题目描述 德国放松对英国的进攻后,把矛头指向了东边——苏联.1943年初,东线的战斗进行到白热化阶段.据可靠情报,90余万德国军队在库尔斯克准备发 ...

  10. 洛谷—— P1775 古代人的难题_NOI导刊2010提高(02)

    P1775 古代人的难题_NOI导刊2010提高(02) 题目描述 门打开了,里面果然是个很大的厅堂.但可惜厅堂内除了中央的一张羊皮纸和一支精致的石笔,周围几具骷髅外什么也没有.难道这就是王室的遗产? ...

随机推荐

  1. 前端 ----- 初探ES6 Promise

    前段时间做项目,在调用接口的时候,遇到了异步问题.开始是使用定时器,发现效果并不理想,于是又用了回调,效果还好但是,很明显的影响了代码的整洁性. 于是我想起了在面试的那段时间,背过的面试题里,出现过一 ...

  2. Pjsip Porting to Hisilicon SOC

    1)HiSilicon Compiler arm-himix100-linux.tgz or arm-himix100-linux.tgz #Installation instructions are ...

  3. hadoop_hdfs_上传文件报错

    错误提示: INFO hdfs.DFSClient: Exception in createBlockOutputStream java.io.IOException: Bad connect ack ...

  4. MAT in eclipse - memory analyzer

    In Help > Install New Software..., enter the following update site URL: http://download.eclipse.o ...

  5. rabbitmq 从channal获得socket

    std::string queue_name = "hello100"; AmqpClient::Channel::ptr_t channel = AmqpClient::Chan ...

  6. 在Linux服务器上运行jar包,并且使jar包一直处于后台执行

    1.我jar包在linux的目录为/a/bbb.jar         正常情况下,使用在/a目录下使用  java -jar bbb.jar 可以直接运行该jar包的项目,运行成功之后使用crtl+ ...

  7. 前端BFC布局学习

    BFC,全称为(Block formatting context).按照我的理解是我们在某一条件下会触发BFC布局,会产生一定的效果. Block Formatting Contexts翻译为:块级元 ...

  8. java中switch的用法以及判断的类型有哪些(String\byte\short\int\char\枚举类型)

    switch关键字对于多数java学习者来说并不陌生,由于笔试和面试经常会问到它的用法,这里做了一个简单的总结: 能用于switch判断的类型有:byte.short.int.char(JDK1.6) ...

  9. js中数组Array 详解

    unshift:将参数添加到原数组开头,并返回数组的长度    pop:删除原数组最后一项,并返回删除元素的值:如果数组为空则返回undefined    push:将参数添加到原数组末尾,并返回数组 ...

  10. Linux系统重要文件(三)

    一系统运行级别文件 文件路径:/etc/inittab 文件作用说明:定义系统启动后,自动开启哪些软件程序系统 runlevel 查看当前运行级别 centos6系统运行级别: 7个级别      0 ...